RxJava访问项目下游

时间:2016-12-07 22:04:04

标签: java java-8 reactivex rx-java2

我已将几个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);
    });

2 个答案:

答案 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();

flatMapSingleflatMapCompletable没有类似的覆盖方法,因此您必须将SingleCompletable转换为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