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()
我正在努力想出 "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()