在上一章中,我们刚刚看到过滤了我们不关心数据的方法,有时候我们想要的是关于 sequence 的信息,而不是值本身。我们现在将介绍一些方法,让我们能够对 sequence 进行解释。
all
ALl 方法会建立一个 observable 发出的每个值都符合一个标准。下面是例子:
public final Observable<java.lang.Boolean> all(Func1<? super T,java.lang.Boolean> predicate)
输出:
该方法的展示一个有趣的事实是,它返回单个值的 observable ,而不是直接返回布尔值。这是因为不知道需要多长时间才能确定结果是否正确。即使它能够尽快完成,这可能需要花费源 sequence 本身的时间。一旦一个 item 失败,谓词就会发出false。另一方面,在源 sequence 完成并检查所有项之前,不能发出true值。在 observables 范围内返回决策是使操作非阻塞的一种方便的方法。在下一个示例中,我们可以尽快看到所有的failing:
输出:
如果源 observable 发出错误,则 all 方法变得无关,并且错误通过,终止序列。
输出:
但是,如果谓词失败,则发出false并终止序列。即使源 observable 在此之后失败,也会按照 Rx 契约的要求忽略事件(终止事件后没有事件)。
输出:
exists
EXISTS方法如果由该 observable 发出的任何一个值使谓词为真,则该方法将发出true。
输出:
如果我们这么写,你也知道会输出什么吧
Observable<Integer> values = Observable.range(0, 4);
isEmpty
这个操作的结果是个boolean,指示 observable 的值发出是否在完成之前。
输出:
一旦发出第一个值,就会建立false,一旦可观察到的源终止,就会返回true。
contains
该方法包含建立一个特定的元素是否是由一个 observable 发出的。contains将使用Object.equals方法来判断相等。
输出:
在我们使用 contains(4L) 的换成 contains(4),那么将不会打印出什么,因为在java中 4 和 4L 是不想等的。但是我们的 observable 是无限的,所以你知道的。
defaultIfEmpty
如果一个空 sequence 会给您带来问题,您可以强制一个 observable 在完成时发出一个值,如果它在完成之前没有发出任何值的话。
输出:
只有在未出现其他值且仅在成功完成时才会发出默认值。如果源不是空的,那么结果就是可以观察到的源。在发生错误的情况下,默认值不会在错误之前发出。
输出:
elementAt
您可以使用 ElementA t方法从 observable 元素中选择一个元素
输出:
如果超出范围,会报出 java.lang.IndexOutOfBoundsException 错误,哦们也可以提供一个默认值来规避这种异常。
输出:
sequenceEqual
本章的最后一个 operator 通过比较同一索引处的值来确定两个序列是否相等。序列的大小和值必须相等。该函数要么使用Object.Equals,要么使用您提供的函数来比较值。
输出:
上面这个例子,如果使用 Object.equals ,那么结果就是 false 啦。
失败不是比较的一部分。一旦任一序列失败,所产生的可观察的结果就会错误。
输出: