gpt4 book ai didi

java - 使用 RXJava2 合并/展平 Android 中的嵌套列表

转载 作者:行者123 更新时间:2023-12-01 08:47:52 24 4
gpt4 key购买 nike

我正在努力想出一个 RXJava2 解决方案来解决“一个简单的问题”。除了简单的用例之外,我对 RXJava 没有太多经验。

假设我有一个Container看起来像:

class Container {
List<A> listOfA;
}

模型的其余部分是一系列嵌套列表,如下模型:

class Base {
// irrelevant content
}

class A extends Base {
List<B> listOfB;
}

class B extends Base {
// irrelevant content
}

在我的代码中的某个位置,我获得了 Single<Container>像这样:

(注意:代码/类型/等已被混淆/简化,以便于阅读)

disposables = new CompositeDisposable(); // not important here

disposables.add(
interactor.getTheContainer() // This returns a Single<Container>
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSingleObserver<Container>() {

// on error ommited for clarity

@Override
public void onSuccess(final Container value) {
process(value);
}
})
);

private void process(final Container container) {
List<Base> items = new ArrayList<>();

List<A> listOfA = container.getListOfA();

for (A a : listOfA) {
items.add(a);
items.addAll(a.getListOfB());
}

// do something with "items" - ommited for clarity
}

我一直未能成功尝试转换方法 process(Container)到 RXJava(也许我不应该,但现在我想知道)。

我什至无法开始列出我尝试过的所有内容,但我对 RXJava 2 确实很陌生(过去几年我对 RX 所做的大多数用法都是来自 Retrofit 的简单 Observables,什么也没有奇特,甚至作为事件总线来取代 Otto/Guava),所以我真的不熟悉如何充分利用 RX 工具集。我认为某种映射应该可以工作,但是当涉及到匿名方法时,整个 Java 语法很快就会让我感到困惑。

问题是:

我应该在哪里阅读/寻找如何执行 process 相同操作的想法方法但使用 RXJava2?

顺序很重要,使用当前方法,最终列表看起来像这样,我需要这样:

0. A1
1. B1.1
2. B1.2
3. B1.nn…
4. A2
5. B2.1
6. B2.2
7. B2.nn…
8. A3
9. B3.1

你明白了。

有什么提示吗?我没有有 Retrolambda 或 Java 8(也不能使用它,这不是我的决定,我对此无能为力)。

最佳答案

你就快到了:

List<Base> process(List<A> list) {
List<Base> result = new ArrayList<>();
for (A a : list) {
result.add(a);
result.addAll(a.getListOfB());
}
return result;
}

interactor.getTheContainer() // This returns a Single<Container>
.subscribeOn(Schedulers.io())
.map(new Function<Container, List<Base>>() {
@Override public List<Base> apply(Container c) {
return process(c.getListOfA());
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSingleObserver<List<Base>>() {
@Override public void onSuccess(final List<Base> value) {
/* display the list */
}
})

更“复杂”的解决方案可以通过IxJava用一些可迭代的转换来替换上面的 map 。 :

.flatMapIterable(new Function<Container, Iterable<A>>() {
@Override public Iterable<A> apply(Container c) {
return c.getListOfA();
}
})
.flatMapIterable(new Function<Iterable<A>, Iterable<Base>>() {
@Override public Iterable<Base> apply(Iterable<A> a) {
return Ix.<Base>just(a).concatWith(a.getListOfB());
}
})
.toList()

关于java - 使用 RXJava2 合并/展平 Android 中的嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42568849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com