RxJava 之条件操作符和布尔操作符

RxJava 的条件操作符主要包括以下几个:

  • amb():给定多个 Observable, 只让第一个发射数据的 Observable 发射全部数据
  • defaultIfEmpty():发射来自原始 Observable 的数据,如果原始的 Observable 没有发射数据,则发射一个默认数据
  • skipUntil():丢弃原始 Observable 发射的数据,直到第二个 Observable 发射了一个数据,然后发射原始 Observable 的剩余数据
  • skipWhile():丢弃原始 Observable 发射的数据直到一个特定的条件为假,然后发射原始 Observable 剩余的数据
  • takeUntil():发射来自原始 Observable 的数据,直到第二个 Observable 发射了一个数据或通知
  • takeWhile() takeWhileWithIndex():发射原始 Observable 的数据,直到一个特定的条件为真,然后跳过剩余的数据

RxJava 的布尔操作符主要包括以下几个:

  • all():判断是否所有的数据项是否满足某个条件
  • contains():判断 Observable 是否发射了一个指定的值
  • exists() isEmpty():判断 Observable 是否发射了一个值
  • sequenceEqual():判断两个 Observable 发射的序列是否相等

all、contains 和 amb

  1. all 操作符 判定 Observable 发射的所有数据是否都满足某个条件。传递一个谓词函数给 all 操作符,这个函数接受原始 Observable 发射的数据,根据计算返回一个布尔值。all 返回一个只发射单个布尔值的 Observable,如果原始 Observable 正常终止并且每一项数据都满足某个条件,则返回 true;如果原始 Observable 的任意一项数据不满足条件,就返回 false。all 操作符默认不在任何特定的调度器上执行。
Observable.just(1, 2, 3, 4, 5)
        .all(integer -> integer < 10)
        .subscribe(System.out::println);
复制代码
  1. contains 操作符 判定一个 Observable 是否发射了一个特定的值,给 contains 传一个指定的值,如果原始 Observable 发射了这个值,那么返回的 Observable 将发射 true,否则发射 false。与它相关的一个操作符是 isEmpty,用于判定原始 Observable 是否未发射任何数据。

  2. amb 操作符 给定两个或多个 Observable,它只发射首先发射数据或通知的那个 Observable 的所有数据,当传递多个 Observable 给 amb 时,它只发射其中一个 Observable 的数据和通知:首先发送通知给 amb 的那个 Observable,不管发射的是一项数据,还是一个 onError 或者 onComplete 通知。amb 将忽略和丢弃其他所有 Observable 的发射物。

Observable.ambArray(
        Observable.just(1, 2, 3),
        Observable.just(4, 5, 6)
).subscribe(System.out::println);
复制代码

2. defaultIfEmpty

发射来自原始 Observable 的值,如果原始 Observable 没有发射任何值,就发射一个默认值。defaultIfEmpty 简单精确的发射原始 Observable 的值,如果原始 Observable 没有发射任何数据,就正常终止(以 onComplete 的形式),那么 defaultIfEmpty 返回的 Observable 就发射一个提供的默认值。defaultIfEmpty 默认不在任何特定的调度器上执行。

Observable.empty()
        .defaultIfEmpty(8)
        .subscribe(System.out::println);
复制代码

在 defaultIfEmpty 方法内部,其实调用的是 switchIfEmpty。defaultIfEmpty 和 switchIfEmpty 的区别是,defaultIfEmpty 操作符只能在被观察者不发送数据时发送一个默认的数据,如果想要发送更多数据,则可以使用 switchIfEmpty 操作符,发送自定义的被观察者作为替代

Observable.empty()
        .switchIfEmpty(Observable.just(1, 2, 3))
        .subscribe(System.out::println);
复制代码

3. sequenceEqual

判定两个 Observable 是否发射相同的数据序列,传递两个 Observable 给 sequenceEqual 操作符时,它会比较两个 Observable 的发射物,如果两个序列相同(相同的数据,相同的顺序,相同的终止状态),则发射 true,否则发射 false。

Observable.sequenceEqual(
        Observable.just(1, 2, 3, 4, 5),
        Observable.just(1, 2, 3, 4, 5)
).subscribe(System.out::println);
复制代码

sequenceEqual 还有一个版本接受第三个参数,可以传递一个函数用于比较两个数据项是否相同。对于复杂对象的比较,用三个参数的版本更合适。

4. skipUntil 和 skipWhile

  1. skipUntil 操作符 丢弃原始 Observable 发射的数据,直到第二个 Observable 发射了一项数据项,skipUntil 订阅原始的 Observable,但是忽略它的发射物,直到第二个 Observable 发射一项数据的那一刻,它才开始发射原始 Observable。skipUntil 默认不在任何特定的调度器上执行。

  2. skipWhile 操作符 丢弃 Observable 发射的数据,直到一个指定的条件不成立,skipWhile 默认不在任何特定的调度器上执行。

5. takeUntil 和 takeWhile

  1. takeUntil 操作符 当第二个 Observable 发射了一项数据或终止时,丢弃原始 Observable 发射的任何数据。takeUntil 订阅并开始发射原始的 Observable,它还监视第二个 Observable。如果第二个 Observable 发射了一项数据或者发射了一个特定的终止通知,则 takeUntil 返回的 Observable 会停止发射原始 Observable 并终止。takeUntil 默认不在任何特定的调度器上执行。
Observable.just(1, 2, 3, 4, 5, 6, 7, 8)
        .takeUntil(integer -> integer == 5)
        .subscribe(System.out::println);
复制代码
  1. takeWhile 操作符 发射原始 Observable 发射的数据,直到一个特定的条件不成立,它会立即停止发射原始 Observable,并终止自己的 Observable。 RxJava 中的 takeWhile 操作符返回一个原始 Observable 行为的 Observable,直到某项数据指定的函数返回 false,这个新的 Observable 就会发射 onComplete 终止通知。

转载于:https://juejin.im/post/5bd6b00bf265da0af77563fc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值