我已将几个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);
});
答案 0 :(得分:2)
使用Observable.flatmap(Function mapper, BiFunction resultSelector)(或Flowable版本)。 E.g:
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
(或{{1} }})。或者你可以编写自己的运算符;)
答案 1 :(得分:1)
添加到@ maxost的回答,在这里您可以避开上一个select distinct modelFileId,F4.*
from contract
cross apply (select XmlList=convert(xml, '<x>'+replace(modelFileId,';','</x><x>')+'</x>').query('.')) F2
cross apply (select mfid1=XmlNode.value('/x[1]','varchar(512)')
,mfid2=XmlNode.value('/x[2]','varchar(512)')
,mfid3=XmlNode.value('/x[3]','varchar(512)')
,mfid4=XmlNode.value('/x[4]','varchar(512)') from XmlList.nodes('x') F3(XmlNode)) F4
where modelFileId like '%;%'
order by modelFileId
和toCompletable()
:
toObservable()
LAMBDA&#39; d:
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