2016-09-22 82 views
0

我有一个列表List<Single<String>>,我想变成List<String>如何将List <Single <String>>转换为列表<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(); 
    }); 
} 

我最初的实现中所使用Observable.concatWith但将基本上防止并行处理,因为每个单订阅一个在另一个之后。

我也知道我可以将单打的列表变成一个可以发射字符串的Observable,但是我在这种情况下放弃了命令。

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

回答

3

如何

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

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

那不是维护秩序可言。 '''[test_0,test_3,test_6,test_2,test_8,test_9,test_1,test_4,test_5,test_7]''' – Jotschi

+0

对不起,没有看到那个要求,回答更新。 – akarnokd

+0

非常好...完美的作品。在我的情况下subscribeOn可以省略。 – Jotschi

相关问题