三、RxJava基础 ---过滤操作(Filtering Observables)
来源:互联网 发布:家具行业进销存软件 编辑:程序博客网 时间:2024/06/04 00:23
一、前言
上篇主要介绍了 转化操作,本篇介绍过滤操作
二、过滤操作 (Filtering Observables)
Operators that selectively emit items from a source Observable.
从Observable 的源头,有选择的发送。
1、filter
过滤数据。内部通过OnSubscribeFilter过滤数据。
/** * filter 过滤数据。内部通过OnSubscribeFilter过滤数据。 */ private void filterTest(){ Observable.just(1,2,3,4) .filter(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer integer) { if(integer>2){ return true; // 返回 ture 不拦截 } else { return false; // 返回 false 拦截 } //return integer >2; // 过滤数字大于2 的 } }).subscribe(new Subscriber<Integer>() { @Override public void onCompleted() { Log.d("filter-->","onCompleted"); } @Override public void onError(Throwable throwable) { Log.d("filter-->","onError:"+throwable.toString()); } @Override public void onNext(Integer integer) { Log.d("filter-->","onNext"+integer.toString()); } }); }
2、distinct
过滤重复数据,内部通过OperatorDistinct实现。
/** * distinct :过滤重复数据, */ private void distinctTest(){ //基本数据类型 Observable.just(1,2,3,2,3,4,2,1,2) .distinct() .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("---","debounce"+integer);// debounce1 debounce2 debounce3 debounce4 } }); //引用数据类型 Student yasuo = new Student("亚索",12,1022L); Student gailun = new Student("盖伦",18,1001L); Student timo = new Student("提莫",6,1009L); Observable.just(yasuo,yasuo,gailun,timo).distinct().subscribe(new Action1<Student>() { @Override public void call(Student student) { Log.d("student:","---->"+student.toString()); } }); }
3、ElementAt
发射某一项数据. 如果 超出Obserable 的长度, 则会报:
Caused by: java.lang.IndexOutOfBoundsException: 3 is out of bounds
使用 elementAtOrDefault 更安全点。
/** * elementAt :过滤重复数据, */ private void elementAtTest(){ Observable.just(1,2,3,2,3,4,2,1,2) .elementAt(1) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("call","-"+integer);// 2 } }); Observable.just(1,2,3) .elementAtOrDefault(3,0)//超出 Observable 长度 ,默认值 0 更安全点 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("call","-"+integer); // 0 } }); }
4、first / last
如果您只对Observable 的第一项感兴趣,或者符合某些标准条件项目的第一个,您可以通过第一个操作符过滤可观察到的项。
/** * first :只对Observable 的第一项感兴趣,或者符合某些标准条件项目的第一个, */ private void firstOrLastTest(){ Observable.just(1,2,3) .first()// 第一个Observable .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("first","---->"+integer); // 1 } }); Observable.just(1,1,3,2,2,3) .first(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer integer) { return integer>2;// 符合 条件 第一个Observable } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("first","---->"+integer);// 3 } });// lsat 用法 通过first// Observable.just(1,2,3)// .last() // .subscribe(new Action1<Integer>() {// @Override// public void call(Integer integer) {// Log.d("---","debounce -"+integer);// debounce -3// }// }); }
5、IgnoreElements
丢弃所有数据,只发射错误或正常终止的通知。内部通过OperatorIgnoreElements实现。
6、sample/throttleLast
定期发射Observable最近的数据。内部通过OperatorSampleWithTime实现。
private void sampleTest() { Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { subscriber.onNext(1); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } subscriber.onNext(2); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } subscriber.onNext(3); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } subscriber.onNext(4); subscriber.onNext(5); subscriber.onNext(6); } }).sample(999, TimeUnit.MILLISECONDS) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("sample", "-" + integer.toString());// 2 3 6 } }); }
7、skip
跳过开始的N项数据或者一定时间内的数据。内部通过OperatorSkip和OperatorSkipTimed实现过滤。
/** * skip : 跳过开始的N项数据或者一定时间内的数据。 */ private void skipTest(){ Observable.just(1,2,3,4) .skip(2)//跳过 几个 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("skip","-->"+integer);// 3 4 } }); }
8、take
只发射开始的N项数据或者一定时间内的数据。内部通过OperatorTake和OperatorTakeTimed过滤数据。
Observable.just(3,4,5,6) .take(3)//发射前三个数据项 .take(100, TimeUnit.MILLISECONDS)//发射100ms内的数据
9、takeLast
只发射最后的N项数据或者一定时间内的数据。内部通过OperatorTakeLast和OperatorTakeLastTimed过滤数据。takeLastBuffer和takeLast类似,不同点在于takeLastBuffer会收集成List后发射。
Observable.just(3,4,5,6) .takeLast(3) .subscribe(integer -> Log.d("JG",integer.toString()));//4,5,6
- 三、RxJava基础 ---过滤操作(Filtering Observables)
- RxJava 过滤操作符(Filtering Observables Operators)
- RxJava操作符(三)Filtering
- RxJava操作符(三)Filtering
- RxJava操作符(三)Filtering
- RxJava操作符(三)Filtering
- RxJava操作符(三)Filtering
- 一、RxJava基础 ---创建操作(Creating Observables)
- 二、RxJava基础 ---转化操作(Transforming Observables)
- 四、RxJava基础 ---合并操作(Combining Observables)
- RxJava 学习笔记(七) --- Filtering 过滤操作
- RxJava操作符(一)Creating Observables
- RxJava操作符(二)Transforming Observables
- RxJava操作符(一)Creating Observables
- RxJava操作符(二)Transforming Observables
- RxJava操作符(一)Creating Observables
- RxJava Creating Observables(创建操作符)
- RxJava操作符(一)Creating Observables
- 流
- 深入理解Java常用类-----StringBuilder
- weex学习(一):搭建开发环境
- String、StringBuffer与StringBuilder之间区别
- 语法错误,将“Dimensions”插入到完整ReferenceType 中
- 三、RxJava基础 ---过滤操作(Filtering Observables)
- 时间复杂度重要结论
- jQuery UI
- 大数据平台控制台命令大全
- USACO-Section1.3 Ski Course Design【暴力枚举】
- Android
- apk版本更新下载安装
- Quagga-RE
- Paint setPathEffect(PathEffect effect)设置绘制路径的效果