说我有那些课程
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
,它可能是一个解决方案,但我找不到保留和事件引用的方法,以便稍后将设施设置为它们。
什么是反应方式?任何提示都将不胜感激。
答案 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;
}
}