📅  最后修改于: 2023-12-03 15:04:58.263000             🧑  作者: Mango
在RxJava中,条件运算符允许我们判断和选择哪些Observable会被订阅。
amb
操作符amb
操作符接受一个Observable列表作为参数。它会在这些Observable中选择一个并且只选择一个,然后丢弃掉其他的Observable。
Observable<Integer> obs1 = Observable.just(1, 3, 5);
Observable<Integer> obs2 = Observable.just(2, 4, 6);
Observable.amb(obs1, obs2)
.subscribe(System.out::println); // 输出:1
在上面的例子中,我们创建了两个Observable,一个只发出奇数,一个只发出偶数。使用amb
操作符,我们只会得到发出第一个数的Observable。
defaultIfEmpty
操作符defaultIfEmpty
操作符会在原始Observable没有发出任何数据时,发射一个默认的数据。
Observable.empty()
.defaultIfEmpty(42)
.subscribe(System.out::println); // 输出:42
在上述代码中,Observable.empty()
已经发射完事件,所以原本应该产生一个空的Observable。但是使用defaultIfEmpty
,默认的数据42被发射出来。
takeUntil
操作符takeUntil
操作符会订阅两个Observable,原始Observable一直发射数据直到第二个Observable发射了一个数据或者完成。
Observable.interval(1, TimeUnit.SECONDS)
.takeUntil(Observable.timer(5, TimeUnit.SECONDS))
.subscribe(System.out::println); // 输出:0 1 2 3 4
在上述代码中,原始Observable每秒循环产生一个数据,但由于takeUntil
操作符监听了5秒钟timer Observable,所以在timer Observable发射出第一个事件之后,原始Observable就不会再发射数据了。
skipUntil
操作符skipUntil
操作符会订阅两个Observable,原始Observable一直被忽略直到第二个Observable发射了一个数据或者完成。
Observable.interval(1, TimeUnit.SECONDS)
.skipUntil(Observable.timer(5, TimeUnit.SECONDS))
.subscribe(System.out::println); // 输出:5 6 7 ...
在上述代码中,原始Observable每秒循环产生一个数据,当skipObservable发射了一个事件之后,原始的Observable开始发射数据并执行观察者的方法。
takeWhile
操作符takeWhile
操作符会在只有当原始Observable发射数据的时候,检查一个指定的条件。如果满足条件,就继续发射数据;如果不满足条件,就完成。
Observable.just(1, 2, 3, 4, 5, 4, 3, 2, 1)
.takeWhile(i -> i < 4)
.subscribe(System.out::println); // 输出:1 2 3
在上述代码中,原始Observable发射了1-5以及它们的倒序。使用takeWhile
操作符,只有数据小于4的时候才会继续发射。
skipWhile
操作符skipWhile
操作符会在只有当原始Observable发射数据的时候,忽略掉一个指定的条件。如果不满足条件,就继续发射数据;如果满足条件,就忽略它。
Observable.just(1, 2, 3, 4, 5, 4, 3, 2, 1)
.skipWhile(i -> i < 4)
.subscribe(System.out::println); // 输出:4 5 4 3 2 1
在上述代码中,原始Observable发射了1-5以及它们的倒序。使用skipWhile
操作符,只有数据小于4的时候才会被忽略。
skip
操作符skip
操作符会忽略掉前N个数据项,然后发射剩下的数据。
Observable.range(1, 5)
.skip(2)
.subscribe(System.out::println); // 输出:3 4 5
在上述代码中,原始Observable发射了区间[1,5]的整数,我们使用skip
操作符跳过了前两个数字。
take
操作符take
操作符会只发射前N个数据项然后完成。
Observable.range(1, 5)
.take(2)
.subscribe(System.out::println); // 输出:1 2
在上述代码中,原始Observable发射了区间[1,5]的整数,我们使用take
操作符只处理了前两个数字。