【问题标题】:RxJava access item downstreamRxJava 访问项下游
【发布时间】:2016-12-07 22:04:03
【问题描述】:
我已将几个rx 运算符链接在一起以执行多项任务。我需要从下游的父流中的对象访问字段。
即。如何访问channel.uid 下游?
createThing(panel) // Observable<~>
.flatMapSingle(
channel -> {
return createOrUpdateItem(channel);
})
.flatMapCompletable(
item -> {
return linkItemToChannel(item.name, /* need access to channel.uid here */ channel.uid);
});
【问题讨论】:
标签:
java
java-8
reactivex
rx-java2
【解决方案1】:
使用Observable.flatmap(Function mapper, BiFunction resultSelector)(或Flowable 版本)。例如:
createThing(panel) //I assume that this method returns Observable
.flatMap(channel -> createOrUpdateItem(channel).toObservable(),
(channel, item) -> linkItemToChannel(item.name, channel.uid).toObservable())
.toCompletable();
flatMapSingle 或 flatMapCompletable 没有类似的覆盖方法,因此您必须将 Single 和 Completable 转换为 Observable(或 Flowable)。或者您可以编写自己的运算符;)
【解决方案2】:
添加到@maxost 的答案,这里可以避免最后一个toCompletable() 和toObservable():
createThing(panel)
.flatMap(new Function<Channel, ObservableSource<? extends Item>>() {
@Override public ObservableSource<? extends Item> apply(Channel channel) throws Exception {
return createOrUpdateItem(channel).toObservable();
}
},
new BiFunction<Channel, Item, Completable>() {
@Override public Completable apply(Channel channel, Item item) throws Exception {
return linkItemToChannel(item.name, channel.uid);
}
}
)
.ignoreElements() // converts to Completable
Lambda 的:
createThing(panel)
.flatMap(channel -> createOrUpdateItem(channel).toObservable(),
(channel, item) -> linkItemToChannel(item.name, channel.uid))
.ignoreElements() // converts to Completable