Consolidate/flatten Android 中的嵌套列表与 RXJava2

Consolidate/flatten nested lists in Android with RXJava2

我正在努力想出 "a simple problem" 的 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> 像这样:

(注意:code/types/etc 已经 obfuscated/simplified 以便于阅读)

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 一直没有成功(也许我不应该,但现在我想知道)。

我什至不能开始列出我试验过的所有东西,但我对 RX 真的很陌生Java2(过去几年我用 RX 完成的大部分用法是来自 Retrofit 的简单 Observables 并没有什么特别的,甚至作为一个 Event Bus 来代替 Otto/Guava),所以我真的不精通 RX 工具集的使用艺术。我 认为 某种映射应该可以工作,但是当涉及到匿名方法时,整个 Java 语法让我很快就感到困惑。

问题是:

我应该在哪里 read/look 了解如何使用 RXJava2 执行与 process 方法相同的操作?

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

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 */
        }
    })

更多 "convoluted" 解决方案可以通过 IxJava:

将上面的地图替换为一些可迭代转换
.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()