如何使用RxJava

时间:2016-11-30 09:58:24

标签: java system.reactive rx-java2

说我有那些课程

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;
}

目标:使用他们的设施打印每个活动&#39;名。

约束 RxJava2,设施只能逐个加载(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,它可能是一个解决方案,但我找不到保留和事件引用的方法,以便稍后将设施设置为它们。

什么是反应方式?任何提示都将不胜感激。

2 个答案:

答案 0 :(得分: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的订单不会得到保证。

答案 1 :(得分:2)

有一个元组或一个带有event和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; 
  } 
}