在我正在处理的应用中,我使用改造来创建Observable <ArrayList<Party>>
。
Party
有hostId
字段以及类型User
的字段,在Retrofits GsonConverter创建时为空。我现在想要使用hostId
发出第二个请求,让用户从id获取并将User
添加到初始Party
。我一直在研究flatmap,但我还没有找到一个例子,其中第一个observable的结果不仅保留了,而且还被修改。
目前,为了让所有参与者都没有User
我正在做的事情:
Observable<ArrayList<Party>> partiesObs = model.getParties();
partiesObs.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::handlePartyResponse, this::handleError);
如何在每个User
添加Party
,而无需在初始调用的model.getUsers()
方法中调用onSuccess()
,然后必须遍历两个列表?
我理解flatmap()
会返回一个新的Observable而map
没有,但我不确定如何在这种情况下使用它。
谢谢
答案 0 :(得分:0)
与评论一样,您应该尝试更改后端API,以避免使用不合适且效率低下的解决方案。
如果这不可行,你可能会这样做:
.flatMapIterable(list -> list)
.flatMap(party -> model.getUser(party.hostId),
(party, user) -> new Party(user, party.hostId, party.dontCare))
其中:
flatMapIterable
将Observable<ArrayList<Party>>
展平为Observable<Party>
flatMap
的重载需要Function
来将排放(Party
个对象)转换为ObservableSource
(User
个对象)作为第一个参数。第二个参数是BiFunction
,用于组合Party
和User
个对象,您可以使用这些对象创建完全成熟的Party
对象。如果您对copy
对象执行了clone
或Party
操作,那么最后一步会更容易,该操作会占用前一个实例并为其添加字段。