如何使用 RxJava 加载相关对象
How to load relationed objects with RxJava
说我也有 类
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;
}
目标:打印出每个事件及其设施名称。
Constraints: 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
然后我就瞎了,找不到办法让他们 link 回到活动中。我也考虑过使用 zip
,这可能是一个解决方案,但我没有找到一种方法来保留和事件引用,以便稍后为它们设置设施。
反应式的方法是什么?任何提示将不胜感激。
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
的顺序。
有元组或中介 class 事件和 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;
}
}
说我也有 类
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;
}
目标:打印出每个事件及其设施名称。
Constraints: 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
然后我就瞎了,找不到办法让他们 link 回到活动中。我也考虑过使用 zip
,这可能是一个解决方案,但我没有找到一种方法来保留和事件引用,以便稍后为它们设置设施。
反应式的方法是什么?任何提示将不胜感激。
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
的顺序。
有元组或中介 class 事件和 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;
}
}