📜  RxJava-条件运算符(1)

📅  最后修改于: 2023-12-03 15:04:58.263000             🧑  作者: Mango

RxJava-条件运算符

在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操作符只处理了前两个数字。