Элемент доступа RxJava ниже по течению

Я связал вместе несколько операторов 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);
    });

person Ryan R    schedule 07.12.2016    source источник


Ответы (2)


Используйте 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). Или вы можете написать свой собственный оператор;)

person Maksim Ostrovidov    schedule 08.12.2016

Добавляя к ответу @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

Лямбда:

createThing(panel)
.flatMap(channel -> createOrUpdateItem(channel).toObservable(),
        (channel, item) -> linkItemToChannel(item.name, channel.uid))
.ignoreElements() // converts to Completable
person Ryan R    schedule 08.12.2016