2016-09-22 5 views
0

Ich habe eine Liste List<Single<String>>, die ich in eine List<String> verwandeln möchte.Wie transformiere ich die Liste <Single <String>> in die Liste <String>?

Die Reihenfolge sollte beibehalten werden und alle Singles sollten parallel verarbeitet werden.

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(); 
    }); 
} 

Meine anfängliche Implementierung verwendet Observable.concatWith aber das wird im Grunde eine parallele Verarbeitung verhindern, weil jeder einzelne hintereinander gezeichnet wird.

Ich weiß auch, dass ich die Liste der Singles in ein Observable drehen kann, das die Saiten ausstrahlt, aber ich verliere die Reihenfolge in diesem Fall.

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

Antwort

3

Wie wäre es

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

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

, die nicht den Auftrag überhaupt ist die Erhaltung. '' '[test_0, test_3, test_6, test_2, test_8, test_9, test_1, test_4, test_5, test_7]' '' – Jotschi

+0

Entschuldigung, habe diese Anforderung nicht gesehen, Antwort aktualisiert. – akarnokd

+0

Sehr schön ... funktioniert perfekt. Das subscribeOn kann in meinem Fall entfallen. – Jotschi

Verwandte Themen