«1. Введение

В этом руководстве мы рассмотрим тип Maybe\u003cT\u003e в RxJava, представляющий собой поток, который может выдать одно значение, завершиться в пустом состоянии или сообщить об ошибке.

2. Тип Maybe

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\u003cT\u003e и его отношение к другим реактивным типам. как Flowable, Single и Completable.

Как всегда, образцы кода можно найти на GitHub.