ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 条件和布尔操作 ## All 判定是否Observable发射的所有数据都满足某个条件 ![all](https://box.kancloud.cn/9f1fbb35e17097b4b790fa898aa57e28_1496x558.png) 传递一个谓词函数给`All`操作符,这个函数接受原始Observable发射的数据,根据计算返回一个布尔值。`All`返回一个只发射一个单个布尔值的Observable,如果原始Observable正常终止并且每一项数据都满足条件,就返回true;如果原始Observable的任何一项数据不满足条件就返回False。 ![all](https://box.kancloud.cn/5a0cb12ade77b0381096d09ccec90d83_1280x630.png) RxJava将这个操作符实现为`all`,它默认不在任何特定的调度器上执行。 * Javadoc: [all(Func1)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#all(rx.functions.Func1)) ## Amb 给定两个或多个Observables,它只发射首先发射数据或通知的那个Observable的所有数据 ![amb](https://box.kancloud.cn/b0435e920cbf9fa2af0a92098e4b82cc_1490x936.png) 当你传递多个Observable给`Amb`时,它只发射其中一个Observable的数据和通知:首先发送通知给`Amb`的那个,不管发射的是一项数据还是一个`onError`或`onCompleted`通知。`Amb`将忽略和丢弃其它所有Observables的发射物。 ![amb](https://box.kancloud.cn/e35a9ca370891aeab520a387f46f305c_1280x770.png) RxJava的实现是`amb`,有一个类似的对象方法`ambWith`。例如,`Observable.amb(o1,o2)`和`o1.ambWith(o2)`是等价的。 这个操作符默认不在任何特定的调度器上执行。 ## Contains 判定一个Observable是否发射一个特定的值 ![contains](https://box.kancloud.cn/f1dcfd42168c0355f1945d389cfc8a64_1496x560.png) 给`Contains`传一个指定的值,如果原始Observable发射了那个值,它返回的Observable将发射true,否则发射false。 相关的一个操作符`IsEmpty`用于判定原始Observable是否没有发射任何数据。 ![contains](https://box.kancloud.cn/891f11e027e3c5b5ddd6b2e8c942f1d1_1280x640.png) `contains`默认不在任何特定的调度器上执行。 * Javadoc: [contains(Object)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#contains(java.lang.Object)) ![exists](https://box.kancloud.cn/0679490757cb1395828f0282ed9cb9c0_1280x640.png) RxJava中还有一个`exists`操作符,它通过一个谓词函数测试原始Observable发射的数据,只要任何一项满足条件就返回一个发射true的Observable,否则返回一个发射false的Observable。 `exists`默认不在任何特定的调度器上执行。 * Javadoc: [exists(Func1)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#exists(rx.functions.Func1)) ![isEmpty](https://box.kancloud.cn/759009138d1f966d4dc9722b52a76592_1280x640.png) `isEmpty`默认不在任何特定的调度器上执行。 * Javadoc: [isEmpty()](http://reactivex.io/RxJava/javadoc/rx/Observable.html#isEmpty()) ## DefaultIfEmpty 发射来自原始Observable的值,如果原始Observable没有发射任何值,就发射一个默认值 ![defaultIfEmtpy](https://box.kancloud.cn/8a7cbd2332e2335e58f1a4eab4d2b550_1280x610.png) `DefaultIfEmpty`简单的精确地发射原始Observable的值,如果原始Observable没有发射任何数据正常终止(以`onCompleted`d的形式),`DefaultIfEmpty`返回的Observable就发射一个你提供的默认值。 RxJava将这个操作符实现为`defaultIfEmpty`。它默认不在任何特定的调度器上执行。 * Javadoc: [defaultIfEmpty(T)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#defaultIfEmpty(T)) 还有一个新的操作符`switchIfEmpty`,不在RxJava 1.0.0版中,它和`defaultIfEmtpy`类似,不同的是,如果原始Observable没有发射数据,它发射一个备用Observable的发射物。 ## SequenceEqual 判定两个Observables是否发射相同的数据序列。 ![sequenceEqual](https://box.kancloud.cn/02377295822f697f4d46955037d18a75_1496x744.png) 传递两个Observable给`SequenceEqual`操作符,它会比较两个Observable的发射物,如果两个序列是相同的(相同的数据,相同的顺序,相同的终止状态),它就发射true,否则发射false。 ![sequenceEqual](https://box.kancloud.cn/6c54a292f2313ff07b54aa57d863279f_1280x770.png) 它还有一个版本接受第三个参数,可以传递一个函数用于比较两个数据项是否相同。 这个操作符默认不在任何特定的调度器上执行。 * Javadoc: [sequenceEqual(Observable,Observable)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#sequenceEqual(rx.Observable,%20rx.Observable)) * Javadoc: [sequenceEqual(Observable,Observable,Func2)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#sequenceEqual(rx.Observable,%20rx.Observable,%20rx.functions.Func2)) ## SkipUntil 丢弃原始Observable发射的数据,直到第二个Observable发射了一项数据 ![skipUntil](https://box.kancloud.cn/313e204b0df656fc149e08ca3196a6a2_1496x746.png) `SkipUntil`订阅原始的Observable,但是忽略它的发射物,直到第二个Observable发射了一项数据那一刻,它开始发射原始Observable。 RxJava中对应的是`skipUntil`,它默认不在任何特定的调度器上执行。 * Javadoc: [skipUntil(Observable)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#skipUntil(rx.Observable)) ## SkipWhile 丢弃Observable发射的数据,直到一个指定的条件不成立 ![skipWhile](https://box.kancloud.cn/e0f55110b55913e46198b4e40b0afc4d_1280x610.png) `SkipWhile`订阅原始的Observable,但是忽略它的发射物,直到你指定的某个条件变为false的那一刻,它开始发射原始Observable。 `skipWhile`默认不在任何特定的调度器上执行。 * Javadoc: [skipWhile(Func1)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#skipWhile(rx.functions.Func1)) ## TakeUntil 当第二个Observable发射了一项数据或者终止时,丢弃原始Observable发射的任何数据 ![takeUntil](https://box.kancloud.cn/770be264cfe13a785698e6bb3b890906_1494x746.png) `TakeUntil`订阅并开始发射原始Observable,它还监视你提供的第二个Observable。如果第二个Observable发射了一项数据或者发射了一个终止通知,`TakeUntil`返回的Observable会停止发射原始Observable并终止。 ![takeUntil](https://box.kancloud.cn/74ccb9e57defd367a91e79764b88238c_1280x760.png) RxJava中的实现是`takeUntil`。注意:第二个Observable发射一项数据或一个`onError`通知或一个`onCompleted`通知都会导致`takeUntil`停止发射数据。 `takeUntil`默认不在任何特定的调度器上执行。 * Javadoc: [takeUntil(Observable)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#takeUntil(rx.Observable)) ![takeUntil](https://box.kancloud.cn/a5ef45177f1c42eb2dbc6de6b3c58b7c_1280x610.png) 还有一个版本的`takeUntil `,不在RxJava 1.0.0版中,它使用一个谓词函数而不是第二个Observable来判定是否需要终止发射数据,它的行为类似于`takeWhile`。 * Javadoc: [takeUntil(Func1)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#takeUntil(rx.functions.Func1)) ## TakeWhile 发射Observable发射的数据,直到一个指定的条件不成立 ![takeWhile](https://box.kancloud.cn/59d5741223c3b274c41b1e147b552c0a_1280x610.png) `TakeWhile`发射原始Observable,直到你指定的某个条件不成立的那一刻,它停止发射原始Observable,并终止自己的Observable。 RxJava中的`takeWhile`操作符返回一个镜像原始Observable行为的Observable,直到某一项数据你指定的函数返回`false`那一刻,这个新的Observable发射`onCompleted`终止通知。 `takeWhile`默认不在任何特定的调度器上执行。 * Javadoc: [takeWhile(Func1)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#takeWhile(rx.functions.Func1))