使用RXJava2在Android中合并/展平嵌套列表

使用RXJava2在Android中合并/展平嵌套列表,java,android,rx-java2,Java,Android,Rx Java2,我正在努力为一个简单的问题想出一个RXJava2解决方案。除了简单的用例之外,我对RXJava没有太多的经验 假设我有一个容器,看起来像: class Container { List<A> listOfA; } 你明白了 有什么提示吗?我没有Retrolambda或Java 8,也不能使用它,这不是我的决定,我对此无能为力。你几乎做到了: List<Base> process(List<A> list) { List<Base>

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

假设我有一个容器,看起来像:

class Container {
   List<A> listOfA;
}
你明白了

有什么提示吗?我没有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,因为添加一个额外的库需要大量的工作——询问、批准、管理等等…
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
}
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
…
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 */
        }
    })
.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()