Rx java Rx Java,在同步后调用并行异步
我有几个简单的java类如下所示:Rx java Rx Java,在同步后调用并行异步,rx-java,Rx Java,我有几个简单的java类如下所示: public class Parent { public String id; public String name; public List<String> childIds; } private class Child { public String id; public String name; } private class Output { public String name
public class Parent {
public String id;
public String name;
public List<String> childIds;
}
private class Child {
public String id;
public String name;
}
private class Output {
public String name;
public List<String> childNames;
}
我想向rx java发送一个父ID列表。对于每个父Id,rx需要获取父对象,然后对于父对象中的每个子Id,获取子对象。最后,填充输出对象并返回它
我遇到的问题是,获取子对象的调用需要并行完成。这是我到目前为止所拥有的。我使用collect函数将子项添加到使用Async.from获得的输出中。这对于我正在做的事情来说似乎很复杂。这是最好的方法,还是有更好的方法
private class ToOutput implements Func1<Parent, Observable<Output>> {
private Observable<Child> getChildren(Parent p) {
Observable<String> childIds = Observable.from(p.childIds);
return childIds.flatMap(new Func1<String, Observable<Child>>() {
@Override
public Observable<Child> call(String sku) {
return Async.fromCallable(new ToChild(sku), Schedulers.io());
}
});
}
@Override
public Observable<Output> call(final Parent p) {
Func0<Output> initialState = new Func0<Output>() {
@Override
public Output call() {
final Output output = new Output();
output.name = p.name;
output.childNames = new ArrayList<String>();
return output;
}
};
Observable<Child> oChildren = getChildren(p);
Observable<Output> output = oChildren.collect(initialState, new Action2<Output, Child>() {
@Override
public void call(Output output, Child child) {
output.childNames.add(child.name);
}
});
return output;
}
}
@Test
public void test1() throws Exception {
Observable<String> ids = Observable.just("1", "2", "3");
Observable<Parent> parents = getParent(ids);
Observable<Output> output = parents.flatMap(new ToOutput());
... do something with output;
}
您可以定义一个方法,而不是使用Async.fromCallable
可观察的getChildString childId
这基本上就是ToChild.call目前所做的
然后在flatMap中,您可以使用subscribeOnSchedulers.io获得并行性:
可观察的getChildrenParent p{
返回可观察的.fromp.childId
.flatmap新功能1{
公共可观察调用字符串childId{
返回getChildId.subscribeOnSchedulers.io;
}
};
}
在ToOutput中,您可以从toList操作符中获益,而不是自己实现它:
类ToOutput实现Func1{
公共可观测callp{
返回getChildrenp
.mapnew Func1{
公共字符串callChild c{
返回c.name;
}
}
托利斯先生
.mapnew Func1{
公共输出调用列表{
返回新的Outputp.name,l;
}
};
}
}
谢谢你的帮助。这看起来比我的解决方案好多了。