RxJava 学习笔记<六> Inspection

本文介绍了RxJava中处理序列数据的各种方法,包括如何使用all、exists、isEmpty等方法判断序列特性,以及如何利用contains和defaultIfEmpty处理特殊场景。此外还讲解了如何选取序列中的指定元素及序列对比。

在上一章中,我们刚刚看到过滤了我们不关心数据的方法,有时候我们想要的是关于 sequence 的信息,而不是值本身。我们现在将介绍一些方法,让我们能够对 sequence 进行解释。

all

ALl 方法会建立一个 observable 发出的每个值都符合一个标准。下面是例子:

public final Observable<java.lang.Boolean> all(Func1<? super T,java.lang.Boolean> predicate)

092213_mDGl_2277632.png

输出:

092240_g5A9_2277632.png

该方法的展示一个有趣的事实是,它返回单个值的 observable ,而不是直接返回布尔值。这是因为不知道需要多长时间才能确定结果是否正确。即使它能够尽快完成,这可能需要花费源 sequence 本身的时间。一旦一个 item 失败,谓词就会发出false。另一方面,在源 sequence 完成并检查所有项之前,不能发出true值。在 observables 范围内返回决策是使操作非阻塞的一种方便的方法。在下一个示例中,我们可以尽快看到所有的failing:

093245_OFbK_2277632.png

输出:

093303_Q5en_2277632.png

如果源 observable 发出错误,则 all 方法变得无关,并且错误通过,终止序列。

093703_rPXY_2277632.png

输出:

093717_dY9C_2277632.png

 

但是,如果谓词失败,则发出false并终止序列。即使源 observable 在此之后失败,也会按照 Rx 契约的要求忽略事件(终止事件后没有事件)。

093930_ZOMC_2277632.png

输出:

094011_stDD_2277632.png

exists

EXISTS方法如果由该 observable 发出的任何一个值使谓词为真,则该方法将发出true。

222850_Ef41_2277632.png

223104_Wa6s_2277632.png

输出:

223132_4Txg_2277632.png

如果我们这么写,你也知道会输出什么吧

Observable<Integer> values = Observable.range(0, 4);

isEmpty

这个操作的结果是个boolean,指示 observable 的值发出是否在完成之前。

223521_PcO7_2277632.png

223707_BZgQ_2277632.png

输出:

223722_RAwT_2277632.png

一旦发出第一个值,就会建立false,一旦可观察到的源终止,就会返回true。

contains

该方法包含建立一个特定的元素是否是由一个 observable 发出的。contains将使用Object.equals方法来判断相等。

223943_1g0h_2277632.png

 224100_JAlq_2277632.png

输出:

224117_hrsU_2277632.png

在我们使用 contains(4L) 的换成 contains(4),那么将不会打印出什么,因为在java中 4 和 4L 是不想等的。但是我们的 observable 是无限的,所以你知道的。

defaultIfEmpty

如果一个空 sequence 会给您带来问题,您可以强制一个 observable 在完成时发出一个值,如果它在完成之前没有发出任何值的话。

224413_aEhZ_2277632.png

224531_jW7E_2277632.png

输出:

224540_2ix9_2277632.png

只有在未出现其他值且仅在成功完成时才会发出默认值。如果源不是空的,那么结果就是可以观察到的源。在发生错误的情况下,默认值不会在错误之前发出。

224808_m1ie_2277632.png

输出:

224828_jaOm_2277632.png

elementAt

您可以使用 ElementA t方法从 observable 元素中选择一个元素

224918_SCZw_2277632.png

225014_MW5E_2277632.png

输出:

225023_M9xw_2277632.png

如果超出范围,会报出 java.lang.IndexOutOfBoundsException 错误,哦们也可以提供一个默认值来规避这种异常。

225212_GtbF_2277632.png

输出:

225221_jvLw_2277632.png

sequenceEqual

本章的最后一个 operator 通过比较同一索引处的值来确定两个序列是否相等。序列的大小和值必须相等。该函数要么使用Object.Equals,要么使用您提供的函数来比较值。

094120_WmXP_2277632.png

输出:

094135_ksND_2277632.png

上面这个例子,如果使用 Object.equals ,那么结果就是 false 啦。

失败不是比较的一部分。一旦任一序列失败,所产生的可观察的结果就会错误。

094320_kQmU_2277632.png

输出:

094336_hroa_2277632.png

223108_3TsV_2277632.png

转载于:https://my.oschina.net/u/2277632/blog/1648933

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值