1. 简介
在本教程中,我们将研究RxJava中的Maybe<T>类型-它表示可以发出单个值、在空状态下完成或报告错误的流。
2. Maybe类型
Maybe是一种特殊的Observable,它只能发出零个或一个元素,如果计算在某个时刻失败,则会报告错误。
在这方面,它就像是Single和Completable的结合。所有这些简化的类型,包括Maybe,都提供了Flowable运算符的一个子集。这意味着只要操作对0或1个元素有意义,我们就可以像Flowable一样使用Maybe。
由于它只能发出一个值,因此它不像Flowable那样支持背压处理:
Maybe.just(1)
.map(x -> x + 7)
.filter(x -> x > 0)
.test()
.assertResult(8);
可以从Maybe源订阅onSuccess、onError和onComplete信号:
Maybe.just(1)
.subscribe(
x -> System.out.print("Emitted item: " + x),
ex -> System.out.println("Error: " + ex.getMessage()),
() -> System.out.println("Completed. No items.")
);
上面的代码将打印“Emitted item: 1”,因为此源将发出成功值。
对于相同的订阅:
- Maybe.empty().subscribe(…)将打印“Completed. No items.”
- Maybe.error(new Exception(“error”)).subscribe(…)将打印“Error: error”
这些事件对于Maybe是互斥的。也就是说,onComplete不会在onSuccess之后被调用。这与Flowable略有不同,因为onComplete将在流完成时被调用,即使在可能的一些onNext调用之后。
Single没有像Maybe那样的onComplete信号,因为它旨在捕获一种可以发出一个元素或失败的反应模式。
另一方面,Completable缺少onSuccess,因为它只用于处理完成/失败的情况。
Maybe类型的另一个用例是将它与Flowable结合使用。firstElement()方法可用于从Flowable创建Maybe:
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"));
3. 总结
在这个简短的教程中,我们快速了解了RxJava Maybe<T>的用法,以及它与其他响应类型(如Flowable、Single和Completable)的关系。
与往常一样,本教程的完整源代码可在GitHub上获得。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章