如何将List <Single <String >>转换为List <String>?

Jot*_*chi 1 rx-java

我有一个列表List<Single<String>>,我想变成一个List<String>.

应保留订单,并且应并行处理所有Single.

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();
  });
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

aka*_*okd 5

怎么样

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

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