转载请标明出处:

http://blog.csdn.net/xmxkf/article/details/51671826

本文出自:【openXu的博客】

目录:

1. All

  判定是否Observable发射的所有数据都满足某个条件。 传递一个谓词函数给All操作符,这个函数接受原始Observable发射的数据,根据计算返回一个布尔值。All返回一个只发射一个单个布尔值的Observable,如果原始Observable正常终止并且每一项数据都满足条件,就返回true;如果原始Observable的任何一项数据不满足条件就返回False。

    

示例代码:

Observable.just(1,2,3,4)
        .all(new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer integer) {
                Log.v(TAG, ""+integer);
                return integer<3;    //判断是不是发射的所有数据都小于3
            }
        }).subscribe(new Subscriber<Boolean>() {
    @Override
    public void onCompleted() {
        Log.v(TAG, "onCompleted");
    }
    @Override
    public void onError(Throwable e) {
        Log.v(TAG, "onError:"+e.getMessage());
    }
    @Override
    public void onNext(Boolean aBoolean) {
        Log.v(TAG, "onNext:"+aBoolean);
    }
});

输出:

1

2

3

onNext:false

onCompleted

2. Amb

  传递两个或多个Observable给Amb时,它只发射其中首先发射数据或通知(onError或onCompleted)的那个Observable的所有数据,而其他所有的Observable的发射物将被丢弃。

  有一个类似的对象方法ambWith。Observable.amb(o1,o2)和o1.ambWith(o2)是等价的。

    

示例代码:

Observable.amb(
        //第一个Observable延迟1秒发射数据
        Observable.just(1,2,3).delay(1,TimeUnit.SECONDS),
        Observable.just(4,5,6))
        .subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {
                Log.v(TAG, "onCompleted");
            }
            @Override
            public void onError(Throwable e) {
                Log.v(TAG, "onError:"+e.getMessage());
            }
            @Override
            public void onNext(Integer integer) {
                Log.v(TAG, "onNext:"+integer);
            }
});

输出:

onNext:4

onNext:5

onNext:6

onCompleted

3. Contains

Contains:判断一个Observable发射的所有数据中,是否包含一个特定的值。给Contains传一个特定的值,如果原始Observable发射了那个值, 它返回的Observable将发射true,否则发射false。

    

IsEmpty:相关的一个操作符IsEmpty用于判定原始Observable是否没有发射任何数据。

    

exists:RxJava中还有一个exists操作符,它通过一个谓词函数测试原始Observable发射的数据,只要任何一项满足条件就返回一个发射true的Observable,否则返回一个发射false的Observable。

    

示例代码:

//Contains:判定一个Observable是否发射一个特定的值
Observable.just(4,5,6)
        .contains(4)
        .subscribe(new Action1<Boolean>() {
            @Override
            public void call(Boolean aBoolean) {
                Log.v(TAG, "contains(4):"+aBoolean);
            }
        });
//isEmpty:判定原始Observable是否没有发射任何数据
Observable.just(4,5,6)
        .isEmpty()
        .subscribe(aBoolean->Log.v(TAG, "isEmpty():"+aBoolean));
//exists操作符,它通过一个谓词函数测试原始Observable发射的数据,
// 只要任何一项满足条件就返回一个发射true的Observable,
// 否则返回一个发射false的Observable。
Observable.just(4,5,6)
        .exists(new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer integer) {
                return integer<5;
            }
        })
        .subscribe(aBoolean->Log.v(TAG, "exists():"+aBoolean));

输出:

contains(4):true

isEmpty():false

exists():true

4. DefaultIfEmpty

  DefaultIfEmpty简单的精确地发射原始Observable的值,如果原始Observable没有发射任何数据正常终止(以onCompletedd的形式),DefaultIfEmpty返回的Observable就发射一个你提供的默认值。

    

示例代码:

Observable.empty()
        .defaultIfEmpty(10)
        .subscribe(integer->Log.v(TAG, "defaultIfEmpty():"+integer));

输出:

defaultIfEmpty():10

5. SequenceEqual

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

    

示例代码:

Observable.sequenceEqual(
        //第一个Observable延迟1秒发射数据
        Observable.just(4,5,6).delay(1,TimeUnit.SECONDS),
        Observable.just(4,5,6))
        .subscribe(aBoolean -> Log.v(TAG, "sequenceEqual:"+aBoolean));

输出:

sequenceEqual:true

6. SkipUntil

  SkipUntil订阅原始的Observable,但是忽略它的发射物,直到第二个Observable发射了一项数据那一刻,它开始发射原始Observable。

    

示例代码:

Observable.interval(1, TimeUnit.SECONDS)
        .take(6)
        .skipUntil(Observable.just(10).delay(3,TimeUnit.SECONDS))
        .subscribe(aBoolean -> Log.v(TAG, "skipUntil:"+aBoolean));

输出:

skipUntil:3

skipUntil:4

skipUntil:5

7. SkipWhile

  SkipWhile订阅原始的Observable,但是忽略它的发射物,直到你指定的某个条件变为false的那一刻,它开始发射原始Observable。

    

示例代码:

Observable.interval(1, TimeUnit.SECONDS)
        .take(6)
        .skipWhile(new Func1<Long, Boolean>() {
            @Override
            public Boolean call(Long aLong) {
                return aLong<3;   //舍弃原Observable发射的数据,直到发射的数据>=3,才继续发射
            }
        })
        .subscribe(aBoolean -> Log.v(TAG, "SkipWhile:"+aBoolean));

输出:

SkipWhile:3

SkipWhile:4

SkipWhile:5

8. TakeUntil

  TakeUntil订阅并开始发射原始Observable,它还监视你提供的第二个Observable。如果第二个Observable发射了一项数据或者发射了一个终止通知( onError通知或一个onCompleted通知),TakeUntil返回的Observable会停止发射原始Observable并终止。

    

示例代码:

//3s后takeUntil的参数Observable发射数据,停止原始Observable
Observable.interval(1, TimeUnit.SECONDS)
        .takeUntil(Observable.timer(3, TimeUnit.SECONDS))
        .subscribe(aBoolean -> Log.v(TAG, "TakeUntil:"+aBoolean));

输出:

TakeUntil:0

TakeUntil:1

9. TakeWhile

  TakeWhile发射原始Observable,直到你指定的某个条件不成立的那一刻,它停止发射原始Observable,并终止自己的Observable。

    

示例代码:

Observable.interval(1, TimeUnit.SECONDS)
        .takeWhile(new Func1<Long, Boolean>() {
            @Override
            public Boolean call(Long aLong) {
                return aLong<3;
            }
        })
        .subscribe(aBoolean -> Log.v(TAG, "TakeWhile:"+aBoolean));

输出:

TakeWhile:0

TakeWhile:1

TakeWhile:2

源码下载:

https://github.com/openXu/RxJavaTest

RxJava操作符(08-条件和布尔操作)的更多相关文章

  1. Rxjava - 操作符,线程操作的简单使用

    目录 创建操作符 10种常用的操作符定义 下面做几个操作符的demo演示 create from repeat defer interval Scheduler 什么是Scheduler? 如何使用S ...

  2. RxJava操作符实践:8_算术和聚合操作之3_min

    发射原始Observable的最小值. Min操作符操作一个发射数值的Observable并发射单个值:最小的那个值. RxJava中,min属于rxjava-math模块. min接受一个可选参数, ...

  3. RxJava 操作符 on和doOn 线程切换 调度 Schedulers 线程池 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. RxJava操作符总结之过滤

    RxJava操作符总结之过滤 jsut() just(T t1, T t2, T t3 ....) ,just能够传入多个同样类型的參数,并将当前參数一个接着一个的发送. Observable.jus ...

  5. [C#.NET 拾遗补漏]05:操作符的几个骚操作

    阅读本文大概需要 1.5 分钟. 大家好,这是极客精神[C#.NET 拾遗补漏]专辑的第 5 篇文章,今天要讲的内容是操作符. 操作符的英文是 Operator,在数值计算中习惯性的被叫作运算符,所以 ...

  6. 【NX二次开发】布尔操作

    //布尔操作 //UF_MODL_operations 对两个体执行布尔操作 //UF_MODL_unite_bodies 相加布尔操作,不可保留目标体.工具体 //UF_MODL_unite_bod ...

  7. RxJava操作符(07-辅助操作)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51658445 本文出自:[openXu的博客] 目录: Delay Do Materiali ...

  8. RxJava操作符(05-结合操作)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51656736 本文出自:[openXu的博客] 目录: CombineLatest Join ...

  9. RxJava操作符(04-过滤操作)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51656494 本文出自:[openXu的博客] 目录: Debounce Distinct ...

随机推荐

  1. 【Python3.6+Django2.0+Xadmin2.0系列教程之二】学生信息管理系统(入门篇)

    上一篇我们已经创建好了一个Xadmin的基础项目,现在我们将在此基础上构建一个同样很基础的学生信息管理系统. 一.创建模型 模型是表示我们的数据库表或集合类,并且其中所述类的每个属性是表或集合的字段, ...

  2. hive中No space left on device问题或者Java HotSpot(TM)64-Bit Server VM warning:Insufficient space for shared memory

  3. DDD实战进阶第一波(六):开发一般业务的大健康行业直销系统(实现产品上下文仓储与应用服务层)

    前一篇文章我们完成了产品上下文的领域层,我们已经有了关于产品方面的简单领域逻辑,我们接着来实现产品上下文关于仓储持久化与应用层的用例如何来协调 领域逻辑与仓储持久化. 首先大家需要明确的是,产品上下文 ...

  4. Centos常用命令之:ln

    在linux中[ln]这个命令用来创建连接文件. 共有两种连接文件:一种是类似与Windows的快捷方式(软链接),另一种就是通过文件系统的inode来产生的新的文件名(硬链接). 这里解释下什么叫i ...

  5. [Codeforces 750E]New Year and Old Subsequence

    Description 题库链接 给出一个长度为 \(n\) 的仅包含数字的字符串. \(q\) 次询问,每次询问该串 \([a,b]\) 段内删去几个数能够使其不含 \(2016\) 的子串,但存在 ...

  6. [Apio2009]Atm

    题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...

  7. 【BZOJ4196】【Noi2015】软件包管理器

    原题传送门 题意: 给你一棵树,有2种操作: 1.使得某个点到根节点路径上的所有点权值赋为1. 2.使得某节点的子树中所有节点权值赋为0. 每次操作要求输出权值更改的节点个数. 解题思路: 显然是用树 ...

  8. bzoj1132[POI2008]Tro 计算几何

    1132: [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1722  Solved: 575[Submit][Status] ...

  9. 荣耀10带来AI版WPS,玩转潮酷新功能

    图书馆里,想把喜欢的句子和情节留存, 无奈摘抄需要时间,拍下来又很容易遗忘在相册? 课堂偷偷拍摄的课件, 模糊一片难以辨认? 开会培训收集的PPT照片, 总有那么几页对焦失败? 这些当时起劲,后来就& ...

  10. 详解linux进程间通信-管道 popen函数 dup2函数

    前言:进程之间交换信息的唯一方法是经由f o r k或e x e c传送打开文件,或通过文件系统.本章将说明进程之间相互通信的其他技术-I P C(InterProcess Communication ...