2017-03-02 6 views
1

Ich habe zwei Listen: List<Foo> und List<Bar>. Für jedes Element von List<Foo> muss ich alle Elemente von List<Bar> überprüfen und einen Wert festlegen, wenn es übereinstimmt. Heute verwende ich diesen Code:Ersetzen Sie doppelt für jedes durch beobachtbare

fooList.forEach { foo -> 
    barList.forEach { bar -> 
     if(foo.id == bar.id) { 
      bar.name = foo.name 
     } 
    } 
} 
return barList 

ich möchte es ändern, denn jetzt habe ich eine Observable<Foo> und eine Observable<Bar>. Wie kann ich meinen Code ersetzen, um die reaktive Programmierung zu verwenden?

Antwort

4

Sie könnten die Bar s in eine Map von ID Name und Lauf foo Sequenz mit ihm sammeln:

Observable<Bar> bars = ... 
Observable<Foo> foos = ... 

bars 
    .toMap(bar -> bar.id, bar -> bar.name) 
    .flatMap(map -> 
     foos.doOnNext(foo -> { 
      String name = map.get(foo.id); 
      if (name != null) { 
       foo.name = name; 
      } 
     }) 
    ) 
    .subscribe(...) 
+0

Es funktioniert nicht, weil in einigen Fällen die beobachtbaren leer sind, und die beobachtbaren sind nicht . Wenn es passiert, wird alles emitiert – pablobaldez

+0

Wenn Balken leer ist, wie erwarten Sie, dass es mit einem nicht leeren foo übereinstimmt? – akarnokd

+0

Wenn es leer ist, werden alle foo's der ältere Name sein, aber sie müssen ausgegeben werden – pablobaldez

Verwandte Themen