前言:

本文将介绍以下过滤类操作符(基于Rxjava2.0):

  • filter
  • ofType
  • take
  • takeLast
  • first
  • firstOrError
  • last
  • lastOrError
  • skip
  • skipLast
  • elementAt
  • elementAtOrError
  • debounce
  • throttleWithTimeout
  • distinct
  • ignoreElements
  • sample
  • throttleLast
  • throttleFirst

1,filter()

  • 描述:Filter操作符使用你指定的一个谓词函数测试数据项,只有通过测试的数据才会被发射。

  • 示意图:

  • 示例:

    Observable.just(1, 2, 3, 4, 5).filter(new Predicate<Integer>() {@Overridepublic boolean test(Integer integer) throws Exception {return integer > 3;}}).subscribe(new Consumer<Integer>() {@Overridepublic void accept(Integer integer) throws Exception {System.out.println("accept:" + value);}});
    

    输出:

2,ofType()

  • 描述:ofTypefilter操作符的一个特殊形式。它过滤一个Observable只返回指定类型的数据。

  • 示意图:

  • 示例:

    Observable.just(1, 2, 3, 4, 5).ofType(Integer.class).subscribe(new Consumer<Integer>() {@Overridepublic void accept(Integer value) throws Exception {Log.i(TAG, "accept:" + value);}});Observable.just(1, 2, 3, 4, 5).ofType(String.class).subscribe(new Consumer<String>() {@Overridepublic void accept(String value) throws Exception {Log.i(TAG, "accept:" + value);}});
    

    第一个示例输出1、2、3、4、5这五个数字,而第二个示例将不会输出任何值。

3,take()

  • 描述:使用Take操作符让你可以修改Observable的行为,只返回前面的N项数据,然后发射完成通知,忽略剩余的数据。

    如果你对一个Observable使用take(n)(或它的同义词limit(n))操作符,而那个Observable发射的数据少于N项,那么take操作生成的Observable不会抛异常或发射onError通知,在完成前它只会发射相同的少量数据。

  • 示意图:

  • 示例:

    Observable.just(1, 2, 3, 4, 5).take(3).subscribe(new Consumer<Integer>() {@Overridepublic void accept(Integer value) throws Exception {System.out.println("accept:" + value);}});
    

    输出:

4,takeLast()

  • 描述:使用TakeLast操作符修改原始Observable,你可以只发射Observable发射的后N项数据,忽略前面的数据。注意:这会延迟原始Observable发射的任何数据项,直到它全部完成。

  • 示意图:

  • 示例:

    Observable.just(1, 2, 3, 4, 5).takeLast(2).subscribe(new Consumer<Integer>() {@Overridepublic void accept(Integer value) throws Exception {System.out.println("accept:" + value);}});
    

    输出:

5,first()

  • 描述:只发射第一项(或者满足某个条件的第一项)数据。此方法的实现为:first(defaultItem),返回第一个数据,如果Observagle没有发射任何数据时发射一个你在参数中指定的默认值。

  • 示意图:

  • 示例:

    Observable.just(1, 2, 3, 4, 5).first(2).subscribe(new Consumer<Object>() {@Overridepublic void accept(Object value) throws Exception {System.out.println("accept:" + value);}});Observable.empty().first(2).subscribe(new Consumer<Object>() {@Overridepublic void accept(Object value) throws Exception {System.out.println("accept:" + value);}});
    

    第一个输出:1

    第二个输出:2(默认值)

6,firstOrError()

  • 描述:与frist()类似,返回第一个数据,如果Observagle没有发射任何数据时发出一个NoSuchElementException的信号。

7,last()

  • 描述:与first()类似,区别是返回最后一个数据,不再示例。

8,lastOrError()

  • 描述:与firstOrError()类似,返回最后一个数据,如果没有任何数据则发出一个NoSuchElementException

9,skip()

  • 描述:忽略Observable发射的前N项数据,只保留之后的数据。

  • 示意图:

  • 示例:

    Observable.just(1,2,3,4,5).skip(2).subscribe(new Consumer<Object>() {@Overridepublic void accept(Object value) throws Exception {System.out.println("accept:" + value);}});
    

    输出:

  • 重载:

    • skip(long,TimeUnit)
    • skip(long,TimeUnit,Scheduler)

10,skipLast()

  • 描述:忽略Observable发射的后N项数据,只保留前面的数据。

    功能使用与skip相同,不再示例。

  • 示意图:

  • 重载:

    • skipLast(long time, TimeUnit unit)
    • skipLast(long time, TimeUnit unit, Scheduler scheduler)
    • skipLast(long time, TimeUnit unit, boolean delayError)
    • skipLast(long time, TimeUnit unit, Scheduler scheduler, boolean delayError)
    • skipLast(long time, TimeUnit unit, Scheduler scheduler, boolean delayError, int bufferSize)

11,elementAt()

  • 描述:只发射第N项数据。注意索引从0开始。

  • 示意图:

  • 示例:

    Observable.just(1,2,3,4,5).elementAt(1).subscribe(new Consumer<Object>() {@Overridepublic void accept(Object value) throws Exception {System.out.println("accept:" + value);}});
    

    输出:

  • 重载:elementAt(long index, T defaultItem)

    elementAt(long)相同,区别是如果index超过observable发送数据量的范围,返回一个默认的值。

12,elementAtOrError()

  • 描述:只发射第N项数据,如果不存在则发送NoSuchElementException错误。

13,debounce()

  • 描述:仅在过了一段指定的时间还没发射数据时才发射一个数据。Debounce操作符会过滤掉发射速率过快的数据项。(此操作符常用于按钮防抖动

    注意:这个操作符会会接着最后一项数据发射原始Observable的onCompleted通知,即使这个通知发生在你指定的时间窗口内(从最后一项数据的发射算起)。也就是说,onCompleted通知不会触发限流。

  • 示意图:

  • 示例:

    Observable.intervalRange(0, 5, 0, 100, TimeUnit.MILLISECONDS).debounce(10, TimeUnit.MILLISECONDS).subscribe(new Consumer<Object>() {@Overridepublic void accept(Object value) throws Exception {System.out.println("accept:" + value);}});Observable.intervalRange(0, 5, 0, 100, TimeUnit.MILLISECONDS).debounce(110, TimeUnit.MILLISECONDS).subscribe(new Consumer<Object>() {@Overridepublic void accept(Object value) throws Exception {System.out.println("accept:" + value);}});
    

    第一个输出:0,1,2,3,4。因为防抖动时间小于数据源发射数据的时间间隔,所以正常接收。

    第二个输出:4。因为防抖动时间还没走完,数据源就发来的下一个数据,这时重新计时,直到最后一个数据4的时候,走完了110ms,最终发送。

  • 重载:debounce(long timeout, TimeUnit unit, Scheduler scheduler)

14,throttleWithTimeout()

  • 描述:与debounce()功能和用法一模一样。实际上此操作符是调用debounce()方法来实现的。

  • 重载:throttleWithTimeout(long timeout, TimeUnit unit, Scheduler scheduler)

15,distinct()

  • 描述:抑制(过滤掉)重复的数据项,只允许还没有发射过的数据项通过。

  • 示意图:

  • 示例:

    Observable.just(1,2,1,1,2,3,3).distinct().subscribe(new Consumer<Object>() {@Overridepublic void accept(Object value) throws Exception {System.out.println("accept:" + value);}});
    

    输出:

  • 重载:

    • distinct(Function<? super T, K> keySelector)允许调整判定两个数据不同的标准

    这个说一下,因为还是比较常用的。很多时候我们需要给一个bean类集合去重,那这时候就需要我们自定义去重规则。网上几乎没有这个重载方法的示例,这里我简单写一个,让大家好理解使用。

    示例:

    List<StudentBean> list = new ArrayList<>();
    list.add(new StudentBean("小一", 20));
    list.add(new StudentBean("小二", 22));
    list.add(new StudentBean("小三", 20));
    list.add(new StudentBean("小四", 21));
    list.add(new StudentBean("小五", 21));Observable.fromIterable(list).distinct(new Function<StudentBean, Integer>() {@Overridepublic Integer apply(StudentBean bean) throws Exception {//根据年龄去重return bean.getAge();}}).subscribe(new Consumer<StudentBean>() {@Overridepublic void accept(StudentBean value) throws Exception {System.out.println("accept:" + value.getName());}});
    

    输出:

    • distinct(Function<? super T, K> keySelector, Callable<? extends Collection<? super K>> collectionSupplier)

16,ignoreElements()

  • 描述:不发射任何数据,只发射Observable的终止通知。

    IgnoreElements操作符抑制原始Observable发射的所有数据,只允许它的终止通知(onError或onCompleted)通过。如果你不关心一个Observable发射的数据,但是希望在它完成时或遇到错误终止时收到通知,你可以对Observable使用ignoreElements操作符,它会确保永远不会调用观察者的onNext()方法。

  • 示意图:

  • 示例:

    Observable.just(1, 2, 3, 4).ignoreElements().subscribe(new CompletableObserver() {@Overridepublic void onSubscribe(Disposable d) {System.out.println("onSubscribe");}@Overridepublic void onComplete() {System.out.println("onComplete");}@Overridepublic void onError(Throwable e) {System.out.println("onError");}});
    

    输出:

17,sample()

  • 描述:定期扫描源Observable产生的结果,在指定的间隔周期内进行采样。

  • 示意图:

  • 示例:

    Observable.interval(1, TimeUnit.SECONDS).sample(2, TimeUnit.SECONDS).subscribe(new Consumer<Long>() {@Overridepublic void accept(Long aLong) throws Exception {System.out.println("accept:" + aLong);}});
    

    输出:

  • 重载:

    • sample(long period, TimeUnit unit, boolean emitLast)
    • sample(long period, TimeUnit unit, Scheduler scheduler)
    • sample(long period, TimeUnit unit, Scheduler scheduler, boolean emitLast)
    • sample(ObservableSource<U> sampler)
    • sample(ObservableSource<U> sampler, boolean emitLast)

18,throttleLast()

  • 描述:功能和用法同sample。内部实现为调用sample对应参数的方法。

19,throttleFirst()

  • 描述:定期发射Observable发射的第一项数据。注意与debounce的区别,debounce是过了一段指定的时间还没发射数据时才发射这个数据。

  • throttleFirst常用于按钮防抖动,防止快速点击时每次都响应操作。示例:

    //使用Rxbinding注册点击事件以创建点击事件observable
    RxView.clicks(btnTest).throttleFirst(1, TimeUnit.SECONDS).subscribe(new Consumer<Object>() {@Overridepublic void accept(Object o) throws Exception {System.out.println("click");}});
    

    测试可知,快速点击情况下,1s内只会打印一次click,防止每次点击都响应。

其他操作符介绍:

Rxjava操作符之创建操作符

Rxjava操作符之变换操作符

Rxjava操作符之结合类操作符

Rxjava操作符之辅助操作

Rxjava操作符之过滤操作相关推荐

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

    版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 目录: 文章目录 1. CombineLatest 2. Join 3. Merge 4. StartWit ...

  2. Android RxJava操作符的学习---过滤操作符

    3.5 过滤操作符 作用 过滤 / 筛选 被观察者(Observable)发送的事件 & 观察者 (Observer)接收的事件 应用场景 根据 指定条件 过滤事件 根据 指定事件数量 过滤事 ...

  3. RxJava操作符(四)Combining

    RxJava操作符(四)Combining 原文链接 http://blog.chinaunix.net/uid-20771867-id-5197584.html 上一篇文章中我们了解了如何对数据进行 ...

  4. RxJava操作符(三)Filtering

    在上一篇文章里,我们了解了转化操作符,能将数据转化为我们想要的格式,但是如果数据集合里面有一些我们想要过滤掉的数据怎么办?这时候我们就需要使用过滤操作符了,有点类似于sql里的where,让Obser ...

  5. 「SQL数据分析系列」4.过滤操作

    来源 |  Learning SQL Generate, Manipulate, and Retrieve Data, Third Edition 作者 | Alan Beaulieu 译者 | Li ...

  6. 【SQL必知必会笔记(3)】SELECT语句的WHERE子句数据过滤操作

    上个笔记主要介绍了利用SELECT语句检索单个/多个/所有列,并利用DISTINCT关键字检索具有唯一性的值.利用LIMIT/OFFSET子句限制结果:以及利用ORDER BY子句排序检索出的数据,主 ...

  7. Android RxJava操作符的学习---创建操作符

    RxJava如此受欢迎的原因,在于其提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求 1. 简介 RxJava 操作符的具体简介如下: 2. 类型 RxJava功能强大,所以其对应的 ...

  8. RxSwift 之过滤操作

    Cover 在前面的基础之上接下来我会介绍一些常用的函数和实用技巧.首先,本文将会介绍那些用于对 next 事件进行过滤的操作.这些过滤操作类似于 Swift 标准库中的 filter 操作.它能在我 ...

  9. [翻译]ElasticSearch官方文档-执行查询和过滤操作

    本文翻译自:www.elastic.co/guide/en/el- 本文是Elasticsearch的入门文档,将会介绍ElasticSearch中的查询操作和过滤操作. 执行查询 现在我们已经看到了 ...

最新文章

  1. java jdk 环境变量配置(window 10 系统)
  2. aix服务重启mysql_mysqld进程几分钟重启一次,如何解决?
  3. [系统安全] 三.IDA Pro反汇编工具初识及逆向工程解密实战
  4. java第二阶段_Java第二阶段总结
  5. 从抛硬币试验看随机游走定义的基本概念错误
  6. 单向链表的逆转(数据结构)(c语言)
  7. JDBC连接Oracle数据库的参数配置
  8. linux中有fd set函数吗,LINUX下FD_SET介绍
  9. 一年级下册数学计算机应用题,一年级数学下册期中检测试题
  10. 解决ubuntu的firefox上网速度慢[转]
  11. oracle 下载 pb12.5,PowerBuilder 12.6
  12. android listview优化,Android ListView 详解及其优化
  13. 非冯计算机的原理方法,计算机之父 冯诺依曼_非冯诺依曼计算机_冯诺依曼提出的原理(7)...
  14. vscode 代码片段如何输出$符号
  15. 上面两点下面一个三角形_章勤琼:三角形内角和180该如何说明 ——小学数学中的合情推理和演绎推理...
  16. 一致 先验分布 后验分布_先验分布、后验分布、似然估计这几个概念是什么意思,它们之间的关系是什么?...
  17. Hyperledger Fabric共识机制
  18. 计组-booth乘法-谈原理和实现
  19. 3-对链家二手房数据进行预处理,以及利用CNN进行多分类操作
  20. Python成长之路【第九篇】:Python基础之面向对象

热门文章

  1. 将oracle数据库中的数据导入redis数据库演示
  2. 分享|2023年全球市场准入认证咨讯
  3. BWA 及 Bowtie 配置及简单使用
  4. Python 抓取微信公众号账号信息
  5. 哈佛《幸福课》 第2课 为什么要学积极心理学
  6. 怎样用python计算π的值_Python 计算 π 值的简单示例
  7. 【FreeRTOS(七)】软件定时器
  8. S7-200SMART案例分析——运动控制编程(三)
  9. linux账号与群组
  10. 01 Android Studio学习第一天