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 操作符详解系列:条件 / 布尔操作符》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

CSS3专业网页开发指南

CSS3专业网页开发指南

Peter Gasston / 李景媛、吴晓嘉 / 人民邮电出版社 / 2014-3-1 / 45.00元

《CSS3专业网页开发指南》是英国著名Web前端开发工程师Peter Gasston对CSS3高级技术的全面介绍。书中既有CSS3的发展历史、基本语法等入门知识介绍,也涵盖了媒体查询、选择器、伪类与伪元素、网页字体、文本排版、图形处理、动画、布局等CSS3前端开发必不可少的知识,还介绍了CSS3的未来发展方向。全书共分为17章,作者在每一章的讲解中都结合了大量的实例,同时也不忘介绍每一项技术的发展......一起来看看 《CSS3专业网页开发指南》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

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

在线压缩/解压 JS 代码

html转js在线工具
html转js在线工具

html转js在线工具