Rxjava操作符之过滤操作
前言:
本文将介绍以下过滤类操作符(基于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()
描述:
ofType
是filter
操作符的一个特殊形式。它过滤一个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操作符之过滤操作相关推荐
- RxJava操作符(05-结合操作)
版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 目录: 文章目录 1. CombineLatest 2. Join 3. Merge 4. StartWit ...
- Android RxJava操作符的学习---过滤操作符
3.5 过滤操作符 作用 过滤 / 筛选 被观察者(Observable)发送的事件 & 观察者 (Observer)接收的事件 应用场景 根据 指定条件 过滤事件 根据 指定事件数量 过滤事 ...
- RxJava操作符(四)Combining
RxJava操作符(四)Combining 原文链接 http://blog.chinaunix.net/uid-20771867-id-5197584.html 上一篇文章中我们了解了如何对数据进行 ...
- RxJava操作符(三)Filtering
在上一篇文章里,我们了解了转化操作符,能将数据转化为我们想要的格式,但是如果数据集合里面有一些我们想要过滤掉的数据怎么办?这时候我们就需要使用过滤操作符了,有点类似于sql里的where,让Obser ...
- 「SQL数据分析系列」4.过滤操作
来源 | Learning SQL Generate, Manipulate, and Retrieve Data, Third Edition 作者 | Alan Beaulieu 译者 | Li ...
- 【SQL必知必会笔记(3)】SELECT语句的WHERE子句数据过滤操作
上个笔记主要介绍了利用SELECT语句检索单个/多个/所有列,并利用DISTINCT关键字检索具有唯一性的值.利用LIMIT/OFFSET子句限制结果:以及利用ORDER BY子句排序检索出的数据,主 ...
- Android RxJava操作符的学习---创建操作符
RxJava如此受欢迎的原因,在于其提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求 1. 简介 RxJava 操作符的具体简介如下: 2. 类型 RxJava功能强大,所以其对应的 ...
- RxSwift 之过滤操作
Cover 在前面的基础之上接下来我会介绍一些常用的函数和实用技巧.首先,本文将会介绍那些用于对 next 事件进行过滤的操作.这些过滤操作类似于 Swift 标准库中的 filter 操作.它能在我 ...
- [翻译]ElasticSearch官方文档-执行查询和过滤操作
本文翻译自:www.elastic.co/guide/en/el- 本文是Elasticsearch的入门文档,将会介绍ElasticSearch中的查询操作和过滤操作. 执行查询 现在我们已经看到了 ...
最新文章
- java jdk 环境变量配置(window 10 系统)
- aix服务重启mysql_mysqld进程几分钟重启一次,如何解决?
- [系统安全] 三.IDA Pro反汇编工具初识及逆向工程解密实战
- java第二阶段_Java第二阶段总结
- 从抛硬币试验看随机游走定义的基本概念错误
- 单向链表的逆转(数据结构)(c语言)
- JDBC连接Oracle数据库的参数配置
- linux中有fd set函数吗,LINUX下FD_SET介绍
- 一年级下册数学计算机应用题,一年级数学下册期中检测试题
- 解决ubuntu的firefox上网速度慢[转]
- oracle 下载 pb12.5,PowerBuilder 12.6
- android listview优化,Android ListView 详解及其优化
- 非冯计算机的原理方法,计算机之父 冯诺依曼_非冯诺依曼计算机_冯诺依曼提出的原理(7)...
- vscode 代码片段如何输出$符号
- 上面两点下面一个三角形_章勤琼:三角形内角和180该如何说明 ——小学数学中的合情推理和演绎推理...
- 一致 先验分布 后验分布_先验分布、后验分布、似然估计这几个概念是什么意思,它们之间的关系是什么?...
- Hyperledger Fabric共识机制
- 计组-booth乘法-谈原理和实现
- 3-对链家二手房数据进行预处理,以及利用CNN进行多分类操作
- Python成长之路【第九篇】:Python基础之面向对象