Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rx java Rx Java,在同步后调用并行异步_Rx Java - Fatal编程技术网

Rx java Rx 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

我有几个简单的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 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; } }; } }
谢谢你的帮助。这看起来比我的解决方案好多了。