Перейти к основному содержимому

RxJava Возможно

· 2 мин. чтения

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 .