2017-03-14 2 views
7

Ich versuche, meinen Code ein wenig aufzuräumen, und Single sieht aus wie eine gute Wahl für mich, da ich etwas mache, das immer nur ein Ergebnis ausstrahlen wird.RxJava flatMapIterable mit einem Single

Ich habe ein Problem obwohl ich zuvor flatMapIterable verwendet, um meine Antwort (eine Liste) zu nehmen und etwas für jeden Gegenstand zu tun. Ich sehe nicht, wie ich das mit Single erreichen kann.

getListOfItems() 
.flatMapIterable(items -> items) 
.flatMap(item -> doSomethingWithItem()) 
.toList() 

Dies funktioniert gut, wenn getListOfItems ist eine Observable Rückkehr, aber wenn ich versuche, und machen es einen Single zurück, dann kann ich nicht flatMapIterable tun und kann keine Alternative, irgendwelche Ideen sehen?

Antwort

17

flattenAsObservable sollte es tun, wird es Single Erfolg Wert Iterable (Liste), Karte und jedes Element der Liste als Observable emittieren.

getListOfItems() 
      .flattenAsObservable(new Function<Object, Iterable<?>>() { 
       @Override 
       public Iterable<?> apply(@NonNull Object o) throws Exception { 
        return toItems(o); 
       } 
      }) 
      .flatMap(item -> doSomethingWithItem()) 
      .toList() 
+0

! Dies ist, was ich gesucht habe –

+0

Single.flattenAsObservable existiert nicht. War es eine Sache von RxJava 1? Gibt es ein v2-Äquivalent? – miguel

+0

@miguel, es ist nur RxJava 2. – yosriz

1

Ich habe Vielen Dank so etwas wie diese

gemacht
@Override 
public Single<List<String>> getAvailablePaths() { 
     return mongoClient.rxFind("t_polygons", new JsonObject()) 
          .toObservable() 
          .flatMapIterable(list -> list) 
          .map(json -> json.getString("path")) 
          .filter(Objects::nonNull) 
          .toList() 
          .toSingle(); 
    }