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,Facilities 只能一一加载(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 回答
2

有一个带有事件和 id 的元组或中间类。

events
  .flatMap(evt -> Observable::fromIterable(Event::getFacilityIds(evt)).map(id -> new Tuple(evt, id)))

当您捕获它时,它必须在范围内。

public class Tuple<X, Y> { 
  public final X x; 
  public final Y y; 
  public Tuple(X x, Y y) { 
    this.x = x; 
    this.y = y; 
  } 
} 
于 2016-11-30T10:45:11.043 回答