1

私もそれらのクラスを持っているとしましょう

class Event {
  int id;
  String name;
  List<Integer> facilityIds;
  List<Facility> facilities; // Empty, the one I need to load
}

class Facility {
  int id;
  String name;
}

目標: すべてのイベントを施設名とともに出力します。

制約: RxJava2、ファシリティは 1 つずつしかロードできません ( getFacility(facilityId))

から、Observable<Event>施設をロードしてそれぞれのイベントに戻す方法がわかりません。

基本的に私は次のようなことを考えていました:

Observable<Event> events;
events
  .map(Event::getFacilityIds)
  .flatMap(Observable::fromIterable)
  .map(facilityId -> service.getFacility(facilityId))
  . // somehow get the event reference and
    // so some event.addFacility() or something similar

その後、私は盲目になり、それらをイベントにリンクする方法を見つけることができません. を使用することも考えましzipたが、それが解決策になる可能性がありますが、後で施設を設定するためのイベント参照を保持する方法が見つかりませんでした。

反応的な方法は何ですか?どんなヒントでも大歓迎です。

4

2 に答える 2

2

forEach についてはどうですか?

events.forEach(event -> Observable.fromIterable(event.facilityIds)
            //or just .map(service::getFacility)
            .map(facilityId -> service.getFacility(facilityId)
            .forEach(facility -> event.facilities.add(facility)))

または、ストリームを継続したい場合doOnNextは、最初の代わりに使用します。 これは、前のオペレーターのスレッドで同期的に実行されます。forEach

getFacility貴重な時間がかかる場合は、次の方法で取得することもできflatMapます。

events.doOnNext(event -> Observable.fromIterable(event.facilityIds)
            .flatMap(facilityId -> 
                    Observable.fromCallable(() -> service.getFacility(facilityId))
                    .subscribeOn(Schedulers.computation()))
            .blockingSubsribe(facility -> event.facilities.add(facility)))

ただし、この場合、結果の順序はfacilities保証されません。

于 2016-11-30T10:18:48.490 に答える