RxJava2 передает данные через flatMap на Single

В rxjava 1 у Observable был этот метод плоской карты

общедоступная конечная наблюдаемая плоская карта (Func1 collectionSelector, Func2 resultSelector)

Это позволило вам передать / объединить исходный результат подписчику на плоскую карту.

Как я могу добиться того же результата с RxJava2?

У меня есть сингл, который излучает A, мне нужно получить B на основе A, а затем использовать A и B для выполнения действия.


person gdogaru    schedule 09.03.2017    source источник


Ответы (3)


У вас есть тот же метод на RxJava2, оба на Observable и Flowable,
но как в RxJava1, так и в 2 нет такого оператора для Single , вы можете преобразовать Single в Observable а затем примените эти операторы.

person yosriz    schedule 09.03.2017


Ответ Йосриза правильный, но для добавления примера кода:

Предполагая следующее:

class A {}

class B {}

class AB {
    private final A a;
    private final B b;

    AB(A a, B b) {
        this.a = a;
        this.b = b;
    }
}

interface AbRepository {

    Single<A> getA();

    Single<B> getB(A a);
}

Обратите внимание, что метод getB требует A в качестве параметра.

Тогда вы сможете:

abRepository.getA()
        .toObservable()
        .flatMap(new Function<A, ObservableSource<B>>() {
            @Override
            public ObservableSource<B> apply(A a) throws Exception {
                return abRepository.getB(a)
                        .toObservable();
            }
        }, new BiFunction<A, B, AB>() {
            @Override
            public AB apply(A a, B b) throws Exception {
                return new AB(a, b);
            }
        })
        .firstOrError();
person David Rawson    schedule 07.04.2018