我有一个列表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).....
答案 0 :(得分:5)
怎么样
List<Single<String>> list = ...
Observable.from(list)
.concatMapEager(s -> s.toObservable().subscribeOn(Schedulers.computation()))
.toList()
.subscribe(System.out::println, Throwable::printStackTrace);