1. Введение
В этом руководстве мы рассмотрим тип Maybe<T>
в RxJava, который представляет собой поток, который может выдать одно значение, завершиться в пустом состоянии или сообщить об ошибке .
2. Тип « может быть »
Maybe
— это особый тип Observable
, который может выдавать только один или ноль элементов и сообщать об ошибке, если в какой-то момент вычисление завершается неудачно.
В этом отношении это похоже на объединение Single
и Completable
. Все эти сокращенные типы, включая Maybe,
предлагают подмножество операторов Flowable
. Это означает , что мы можем работать с Maybe
как с Flowable
, пока операция имеет смысл для 0 или 1 элементов.
Поскольку он может выдавать только одно значение, он не поддерживает обработку обратного давления, как в случае с Flowable
:
Maybe.just(1)
.map(x -> x + 7)
.filter(x -> x > 0)
.test()
.assertResult(8);
Существуют сигналы onSuccess, onError
и onComplete
, на которые можно подписаться из источника Maybe
:
Maybe.just(1)
.subscribe(
x -> System.out.print("Emitted item: " + x),
ex -> System.out.println("Error: " + ex.getMessage()),
() -> System.out.println("Completed. No items.")
);
Приведенный выше код напечатает Emmitted item: 1,
так как этот источник выдаст значение успеха.
Для тех же подписок:
Maybe.empty().subscribe(…)
напечатает«Completed. Нет товаров."
Maybe.error(new Exception("error")).subscribe(…)
напечатает "Error: error"
Эти события являются взаимоисключающими для Maybe
. То есть onComplete
не будет вызываться после onSuccess
. Это немного отличается от Flowable
, поскольку onComplete
будет вызываться, когда поток завершится, даже после, возможно, некоторых вызовов onNext
.
Single
не имеет сигнала onComplete , такого как
Maybe
, потому что он предназначен для захвата реактивного шаблона, который может либо выдать один элемент, либо потерпеть неудачу.
С другой стороны, в Completable
отсутствует onSuccess
, поскольку он предназначен только для ситуаций завершения/сбоя.
Другой вариант использования типа Maybe
— использование его в сочетании с Flowable.
Метод firstElement()
можно использовать для создания Maybe
из Flowable
:
Flowable<String> visitors = ...
visitors
.skip(1000)
.firstElement()
.subscribe(
v -> System.out.println("1000th visitor: " + v + " won the prize"),
ex -> System.out.print("Error: " + ex.getMessage()),
() -> System.out.print("We need more marketing"));
4. Вывод
В этом коротком руководстве мы быстро рассмотрели использование RxJava Maybe<T>
и то, как оно соотносится с другими реактивными типами, такими как Flowable, Single
и Completable.
Как всегда, образцы кода можно найти на GitHub .