2017-03-02 33 views
1

私は2つのリスト:List<Foo>List<Bar>を持っています。 List<Foo>の各項目については、List<Bar>のすべての項目をチェックし、一致する場合は値を設定する必要があります。今日、私はこのコードを使用しています:それぞれを観測可能で置き換える

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

今私はObservable<Foo>Observable<Bar>を持っているので、私は、それを変更したいです。 リアクティブプログラミングを使用するためにコードをどのように置き換えることができますか?

答えて

4

あなたは名前にIDのMapBar秒を収集し、それをfooのシーケンスを実行することができます:

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

それは働いていないいくつかのケースで観察は空で、観察可能ではないので、 。何かが起きたときに発生します – pablobaldez

+0

バーが空の場合、それを空でないfooとどのようにマッチさせるでしょうか? – akarnokd

+0

が空の場合はすべてのfooが古い名前になりますが、放射する必要があります – pablobaldez

関連する問題