2016-09-22 107 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

相關問題