2016-11-30 21 views
1

说我有那些过于类如何加载relationed对象与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; 
} 

目标:打印出他们的设施的名称每个事件。

约束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

怎么样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的顺序不保证。

+0

使用* flatMap *而不是* map *会更好吗?因为我认为'service.getFacility'可能需要一些时间来回应... –

+0

@ oliv37是的,你是对的。我将提供平行版本。你知道如何在平行执行的情况下保证启动顺序吗?因为我从来没有尝试过。 – Beloo

+0

我得到了一个稍微不同的解决方案,但是对于'forEach'的使用让我走上了正确的道路,谢谢。 – oldergod

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; 
    } 
} 
相关问题