Android RxJava 操作符详解系列:条件 / 布尔操作符

栏目: Java · 发布时间: 6年前

内容简介:Android RxJava 操作符详解系列:条件 / 布尔操作符

前言

  • Rxjava ,由于其 基于事件流的链式调用、逻辑简洁 & 使用简单 的特点,深受各大 Android 开发者的欢迎。

Android RxJava 操作符详解系列:条件 / 布尔操作符

如果还不了解 RxJava ,请看文章: Android:这是一篇 清晰 & 易懂的Rxjava 入门教程

  • RxJava 如此受欢迎的原因,在于其 提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求
  • 今天,我将为大家详细介绍 RxJava 操作符中最常用的 条件 / 布尔操作符 ,希望你们会喜欢。
  1. 本系列文章主要基于 Rxjava 2.0
  2. 接下来的时间, 我将持续推出 AndroidRxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注 Carson_Ho的安卓开发笔记 !!
  3. Android RxJava 操作符详解系列:条件 / 布尔操作符

目录

Android RxJava 操作符详解系列:条件 / 布尔操作符

1. 作用

通过设置函数,判断被观察者( Observable )发送的事件是否符合条件

2. 类型

RxJava2 中,条件 / 布尔操作符的类型包括:

Android RxJava 操作符详解系列:条件 / 布尔操作符

  • 下面,我将对每个操作符进行详细讲解

3. 具体操作符详解

  • 注:在使用 RxJava 2 操作符前,记得在项目的 Gradle 中添加依赖:
dependencies {
      compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
      compile 'io.reactivex.rxjava2:rxjava:2.0.7'
      // 注:RxJava2 与 RxJava1 不能共存,即依赖不能同时存在
}

3.1 all()

  • 作用

    判断发送的每项数据是否都满足 设置的函数条件

    若满足,返回 true ;否则,返回 false

  • 具体代码

Observable.just(1,2,3,4,5,6)
                .all(new Predicate<Integer>(){
                    @Override
                    public boolean test( Integer integer) throws Exception {
                        return (integer<=10);
                        // 该函数用于判断Observable发送的10个数据是否都满足integer<=10
                    }
                }).subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                Log.d(TAG,"result is "+ aBoolean);
                // 输出返回结果
            }

        });
  • 测试结果

因为所有数据都满足函数内条件 (每项数据<=10)

Android RxJava 操作符详解系列:条件 / 布尔操作符

3.2 takeWhile()

  • 作用

    判断发送的每项数据是否满足 设置函数条件

    若发送的数据满足该条件,则发送该项数据;否则不发送

  • 具体代码

// 1. 每1s发送1个数据 = 从0开始,递增1,即0、1、2、3
        Observable.interval(1, TimeUnit.SECONDS)
                // 2. 通过takeWhile传入一个判断条件
                .takeWhile(new Predicate<Long>(){
                    @Override
                    public boolean test( Long integer) throws Exception {
                        return (integer<3);
                        // 当发送的数据满足<3时,才发送Observable的数据
                    }
                }).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
            }

            @Override
            public void onNext(Long value) {
                Log.d(TAG,"发送了事件 "+ value);
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onComplete() {
            }
        });
  • 测试结果

Android RxJava 操作符详解系列:条件 / 布尔操作符

3.3 skipWhile()

  • 作用

    判断发送的每项数据是否满足 设置函数条件

    直到该判断条件 = false 时,才开始发送 Observable 的数据

  • 具体使用

// 1. 每隔1s发送1个数据 = 从0开始,每次递增1
        Observable.interval(1, TimeUnit.SECONDS)
                // 2. 通过skipWhile()设置判断条件
                .skipWhile(new Predicate<Long>(){
                    @Override
                    public boolean test( Long aLong) throws Exception {
                        return (aLong<5);
                        // 直到判断条件不成立 = false = 发射的数据≥5,才开始发送数据
                    }
                }).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
            }

            @Override
            public void onNext(Long value) {
                Log.d(TAG,"发送了事件 "+ value);
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onComplete() {
            }
        });
  • 测试结果

Android RxJava 操作符详解系列:条件 / 布尔操作符

3.4 takeUntil()

  • 作用

    执行到某个条件时,停止发送事件

  • 具体使用

// 1. 每1s发送1个数据 = 从0开始,递增1,即0、1、2、3
        Observable.interval(1, TimeUnit.SECONDS)
                // 2. 通过takeUntil的Predicate传入判断条件
                .takeUntil(new Predicate<Long>(){
                    @Override
                    public boolean test( Long integer) throws Exception {
                        return (integer>3);
                        // 返回true时,就停止发送事件
                        // 当发送的数据满足>3时,就停止发送Observable的数据
                    }
                }).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
            }

            @Override
            public void onNext(Long value) {
                Log.d(TAG,"发送了事件 "+ value);
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onComplete() {
            }
        });
  • 测试结果

Android RxJava 操作符详解系列:条件 / 布尔操作符

该判断条件也可以是Observable, 即 等到 takeUntil() 传入的 Observable 开始发送数据,(原始)第1个 Observable 的数据停止发送数据

// (原始)第1个Observable:每隔1s发送1个数据 = 从0开始,每次递增1
        Observable.interval(1, TimeUnit.SECONDS)
                // 第2个Observable:延迟5s后开始发送1个Long型数据
                .takeUntil(Observable.timer(5, TimeUnit.SECONDS))
                .subscribe(new Observer<Long>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "开始采用subscribe连接");
                    }

                    @Override
                    public void onNext(Long value) {
                        Log.d(TAG, "接收到了事件"+ value  );
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "对Error事件作出响应");
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "对Complete事件作出响应");
                    }

                });
  • 测试结果

当第 5s 时,第2个 Observable 开始发送数据,于是(原始)第1个 Observable 停止发送数据

Android RxJava 操作符详解系列:条件 / 布尔操作符

3.5 skipUntil()

  • 作用

    等到 skipUntil() 传入的 Observable 开始发送数据,(原始)第1个 Observable 的数据才开始发送数据

  • 具体使用

// (原始)第1个Observable:每隔1s发送1个数据 = 从0开始,每次递增1
        Observable.interval(1, TimeUnit.SECONDS)
                // 第2个Observable:延迟5s后开始发送1个Long型数据
                .skipUntil(Observable.timer(5, TimeUnit.SECONDS))
                .subscribe(new Observer<Long>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "开始采用subscribe连接");
                    }

                    @Override
                    public void onNext(Long value) {
                        Log.d(TAG, "接收到了事件"+ value  );
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "对Error事件作出响应");
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "对Complete事件作出响应");
                    }

                });
  • 测试结果

5s后( skipUntil() 传入的 Observable 开始发送数据),(原始)第1个 Observable 的数据才开始发送

Android RxJava 操作符详解系列:条件 / 布尔操作符

3.6 SequenceEqual()

  • 作用

    判定两个 Observables 需要发送的数据是否相同

    若相同,返回 true ;否则,返回 false

  • 具体使用

Observable.sequenceEqual(
                Observable.just(4,5,6),
                Observable.just(4,5,6)
        )
                .subscribe(new Consumer<Boolean>() {
                    @Override
                    public void accept( Boolean aBoolean) throws Exception {
                        Log.d(TAG,"2个Observable是否相同:"+ aBoolean);
                        // 输出返回结果
                    }
                });
  • 测试结果

Android RxJava 操作符详解系列:条件 / 布尔操作符

3.7 contains()

  • 作用

    判断发送的数据中是否包含指定数据

    1. 若包含,返回 true ;否则,返回 false
    2. 内部实现 = exists()
  • 具体代码

Observable.just(1,2,3,4,5,6)
                .contains(4)
                .subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                Log.d(TAG,"result is "+ aBoolean);
                // 输出返回结果
            }

        });
  • 测试结果

因为发送的数据中包含4

Android RxJava 操作符详解系列:条件 / 布尔操作符

3.8 isEmpty()

  • 作用

    判断发送的数据是否为空

    若为空,返回 true ;否则,返回 false

  • 具体代码

Observable.just(1,2,3,4,5,6)
          .isEmpty() // 判断发送的数据中是否为空
        }).subscribe(new Action1<Boolean>() {
            @Override
            public void call(Boolean aBoolean) {
                Log.d(TAG,"result is "+ aBoolean); 
                // 输出返回结果
            }
        });
  • 测试结果

因为发送的数据不为空

Android RxJava 操作符详解系列:条件 / 布尔操作符

3.9 amb()

  • 作用

    当需要发送多个 Observable 时,只发送 先发送数据的 Observable 的数据 ,而其余 Observable 则被丢弃。

  • 具体代码

// 设置2个需要发送的Observable & 放入到集合中
        List<ObservableSource<Integer>> list= new ArrayList <>();
        // 第1个Observable延迟1秒发射数据
        list.add( Observable.just(1,2,3).delay(1,TimeUnit.SECONDS));
        // 第2个Observable正常发送数据
        list.add( Observable.just(4,5,6));

        // 一共需要发送2个Observable的数据
        // 但由于使用了amba(),所以仅发送先发送数据的Observable
        // 即第二个(因为第1个延时了)
        Observable.amb(list).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e(TAG, "接收到了事件 "+integer);
            }
        });
  • 测试结果

即只发送了先发送数据的Observable的数据 = 4,5,6

Android RxJava 操作符详解系列:条件 / 布尔操作符

3.10 defaultIfEmpty()

  • 作用

    在不发送任何有效事件( Nex t事件)、仅发送了 Complete 事件的前提下,发送一个默认值

  • 具体使用

Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                // 不发送任何有效事件
                //  e.onNext(1);
                //  e.onNext(2);

                // 仅发送Complete事件
                e.onComplete();
            }
        }).defaultIfEmpty(10) // 若仅发送了Complete事件,默认发送 值 = 10
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "开始采用subscribe连接");
                    }

                    @Override
                    public void onNext(Integer value) {
                        Log.d(TAG, "接收到了事件"+ value  );
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "对Error事件作出响应");
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "对Complete事件作出响应");
                    }
                });
  • 测试结果

Android RxJava 操作符详解系列:条件 / 布尔操作符

至此, RxJava2 中常用的条件 / 布尔操作符讲解完毕

4. Demo地址

上述所有的Demo源代码都存放在: Carson_Ho的Github地址:RxJava2_功能性操作符

5. 总结

  • 下面,我将用一张图总结 RxJava2 中常用的条件 / 布尔操作符

Android RxJava 操作符详解系列:条件 / 布尔操作符

请评论帮顶 / 点赞!因为你的鼓励是我写作的最大动力!


以上所述就是小编给大家介绍的《Android RxJava 操作符详解系列:条件 / 布尔操作符》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First Python

Head First Python

Paul Barry / O'Reilly Media / 2010-11-30 / USD 49.99

Are you keen to add Python to your programming skills? Learn quickly and have some fun at the same time with Head First Python. This book takes you beyond typical how-to manuals with engaging images, ......一起来看看 《Head First Python》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具