java - 如何使用 RxJava 加载相关对象

标签 java system.reactive rx-java2

假设我也有那些类(class)

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 ,这可能是一个解决方案,但我没有找到一种方法来保留和事件引用,以便稍后为它们设置设施。

响应式(Reactive)的方法是什么?任何提示将不胜感激。

最佳答案

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 而不是第一个 流。
这将在前一个运算符(operator)的线程上同步执行。

如果您 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 的顺序不能保证。

关于java - 如何使用 RxJava 加载相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40885257/

相关文章:

java - 即使 while 循环存在,主线程也死了

c# - SelectMany 带有等待和结果排序

c# - 为什么 Observable.Finally 在 Observable.Generate 完成时不被调用?

android - doOnSubscribe 在主线程上被调用

java - Java 中哈希表的单独链接

java - Spring:不调用@PostConstruct

c# - RX 订阅的意外行为 - 订阅 () 和等待任务完成 :~|

android - NetworkOnMainThread 与 Scheduler.io()

reactive-programming - RxJava主题与处理器

java - 从 EditTexts 添加新项目到 SQLite 数据库时出错