如何转换List <single <string>&gt;列出<string>?

时间:2016-09-22 20:08:11

标签: rx-java

我有一个列表List<Single<String>>,我希望将其转换为List<String>

应保留订单,并且所有单一邮件应并行处理。

List<Single<String>> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
  list.add(createSingle(i));
}

// Dummy method which creates a single instance
private Single<String> createSingle(int i) {
  return Single.create(sub -> {
    new Thread(() -> {
      try {
        Thread.sleep(800);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      sub.onSuccess("test_" + i);
    }).start();
  });
}

我的初始实现使用Observable.concatWith但这基本上会阻止并行处理,因为每个单元都是一个接一个地订阅。

我也知道我可以将单曲列表转换为一个发出字符串的Observable,但在这种情况下我放弃了顺序。

List<Observable<String>> obsList = list.stream().map(Single::toObservable).collect(Collectors.toList());
Observable.merge(obsList).....

1 个答案:

答案 0 :(得分:5)

怎么样

List<Single<String>> list = ...

Observable.from(list)
.concatMapEager(s -> s.toObservable().subscribeOn(Schedulers.computation()))
.toList()
.subscribe(System.out::println, Throwable::printStackTrace);