Rxjava操作符学习(过滤操作符)
2018-10-10 本文已影响14人
设计失
过滤操作符主要在Android中用户点击事件的过滤以及一些列表的过滤操作
Debounce 防抖动
在一段时间内仅发出一个事件, 它的实现是throttleFirst 与 debounce,View的点击事件还需要使用rxbinding这个库
debounce.pngprotected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "进入到onCreate()方法");
Button btn = findViewById(R.id.btn);
RxView.clicks(btn)
.throttleFirst(/*windowDuration*/1, /*TimeUnit*/TimeUnit.SECONDS)
.subscribe(new Observer<Object>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object o) {
Log.d(TAG, "当前点击事件时间为:" + System.currentTimeMillis());
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
// 运行结果,每隔一秒执行
10-10 03:52:17.982 18182-18182/com.ellison.filter D/FilterTest: 进入到onCreate()方法
10-10 03:52:22.978 18182-18182/com.ellison.filter D/FilterTest: 当前点击事件时间为:1539143542978
10-10 03:52:24.153 18182-18182/com.ellison.filter D/FilterTest: 当前点击事件时间为:1539143544153
10-10 03:52:25.386 18182-18182/com.ellison.filter D/FilterTest: 当前点击事件时间为:1539143545386
10-10 03:52:26.389 18182-18182/com.ellison.filter D/FilterTest: 当前点击事件时间为:1539143546389
10-10 03:52:27.722 18182-18182/com.ellison.filter D/FilterTest: 当前点击事件时间为:1539143547722
Distinct 过滤到重复的数据
distinct.pngObservable.just("Android", "android", "Rxjava", "iOS", "RXJAVA", "Java")
.map(s -> s.toLowerCase()) // 将所有的单词转换成小写
.distinct()
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.d(TAG, "输出数据为:" + s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
// 运行结果为:
10-10 04:00:00.612 18651-18651/com.ellison.filter D/FilterTest: 进入到onCreate()方法
10-10 04:00:00.850 18651-18651/com.ellison.filter D/FilterTest: 输出数据为:android
10-10 04:00:00.852 18651-18651/com.ellison.filter D/FilterTest: 输出数据为:rxjava
10-10 04:00:00.854 18651-18651/com.ellison.filter D/FilterTest: 输出数据为:ios
10-10 04:00:00.856 18651-18651/com.ellison.filter D/FilterTest: 输出数据为:java
// 还可以传入一个Function
Observable.just("Android", "android", "Rxjava", "iOS", "RXJAVA", "Java")
.map(s -> s.toLowerCase())
.distinct(s -> s.equals("android") ? "Android" : "Java")
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.d(TAG, "输出数据为:" + s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
// 运行结果为:
10-10 04:07:01.941 19067-19067/com.ellison.filter D/FilterTest: 进入到onCreate()方法
10-10 04:07:01.962 19067-19067/com.ellison.filter D/FilterTest: 输出数据为:android
10-10 04:07:01.963 19067-19067/com.ellison.filter D/FilterTest: 输出数据为:rxjava
ElementAt 只发射列表中特定的数据
具体的实现有elementAt、firstElement、
ElementAt.png// elementAt
Observable.just(1, 2, 3, 4)
.elementAt(3)
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.d(TAG, "输出的数据为:" + integer);
}
});
// 运行的结果为:
10-10 06:43:49.140 26660-26660/com.ellison.filter D/FilterTest: 输出的数据为:4
// firstElement
Observable.just(1, 2, 3, 4)
.firstElement()
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.d(TAG, "输出的数据为:" + integer);
}
});
// 运行的结果为:
10-10 06:45:33.999 26830-26830/com.ellison.filter D/FilterTest: 输出的数据为:1
// lastElement
Observable.just(1, 2, 3, 4)
.lastElement()
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.d(TAG, "输出的数据为:" + integer);
}
});
// 运行的结果为:
10-10 06:47:24.034 27009-27009/com.ellison.filter D/FilterTest: 输出的数据为:4
Filter 输出只满足条件的数据
filter.pngObservable.just(1, 2, 3, 4)
.filter(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) throws Exception {
return integer > 2;
}
})
.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.d(TAG, "输出的数据为:" + integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
// 运行的结果为:
10-10 06:50:51.878 27259-27259/com.ellison.filter D/FilterTest: 输出的数据为:3
10-10 06:50:51.879 27259-27259/com.ellison.filter D/FilterTest: 输出的数据为:4
// ofType
Observable.just(1, "String", "Test", 3)
.ofType(Integer.class)
.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.d(TAG, "输出的数据为:" + integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
// 运行的结果为:
10-10 06:55:37.740 27559-27559/com.ellison.filter D/FilterTest: 输出的数据为:1
输出的数据为:3
First 发射第一项数据,或者是满足条件的第一个数据
first.pngObservable.just(4, 5, 6, 6)
.first(1)
.subscribe(new BiConsumer<Integer, Throwable>() {
@Override
public void accept(Integer integer, Throwable throwable) throws Exception {
Log.d(TAG, "输出的数据为:" + integer);
}
});
// 运行的结果为:
10-10 07:03:51.529 28058-28058/com.ellison.filter D/FilterTest: 输出的数据为:4
Last 只发送最后一项数据,或者满足条件的最后一项数据
last.pngObservable.just(5, 6, 7, 8)
.last(-1)
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.d(TAG, "输出的数据为:" + integer);
}
});
// 运行的结果为:
10-10 07:16:27.823 28835-28835/com.ellison.filter D/FilterTest: 输出的数据为:8
Sample 、 throttleLast 只获取到最后一个数据源并发射
throttleLast.pngRxView.clicks(btn)
.sample(2, TimeUnit.SECONDS)
.subscribe(new Observer<Object>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object o) {
Log.d(TAG, "当前的点击事件时间为:" + System.currentTimeMillis());
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
// 运行结果为:
10-10 07:24:45.165 29320-29338/com.ellison.filter D/FilterTest: 当前的点击事件时间为:1539156285165
10-10 07:24:47.249 29320-29338/com.ellison.filter D/FilterTest: 当前的点击事件时间为:1539156287249
10-10 07:24:49.167 29320-29338/com.ellison.filter D/FilterTest: 当前的点击事件时间为:1539156289165
10-10 07:24:51.162 29320-29338/com.ellison.filter D/FilterTest: 当前的点击事件时间为:1539156291162
Skip 抑制数据源的前N项
skip.pngObservable.just(11, 22, 33, 44)
.skip(3)
.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.d(TAG, "输出的数据为:" + integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
// 运行的结果为:
10-10 07:30:42.211 29706-29706/com.ellison.filter D/FilterTest: 输出的数据为:44
SkipLast 抑制数据源的最后N项
skipLast.pngObservable.just(11, 22, 33, 44)
.skipLast(2)
.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.d(TAG, "输出的数据为:" + integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
// 运行的结果为:
10-10 07:32:36.307 29880-29880/com.ellison.filter D/FilterTest: 输出的数据为:11
输出的数据为:22
Take 只发射前面N项数据
take.pngObservable.just(11, 22, 33, 44)
.take(3)
.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.d(TAG, "输出的数据为:" + integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
// 运行的结果为:
10-10 07:39:42.287 30322-30322/com.ellison.filter D/FilterTest: 输出的数据为:11
输出的数据为:22
输出的数据为:33
TakeLast 只发送最后N项数据
takeLast.n.pngObservable.just(11, 22, 33, 44)
.takeLast(3)
.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.d(TAG, "输出的数据为:" + integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
// 运行的结果为:
10-10 07:39:42.287 30322-30322/com.ellison.filter D/FilterTest: 输出的数据为:11
输出的数据为:22
输出的数据为:33
总结
过滤操作符总体来说比较容易,主要是对数据、事件进行过滤来减少我们的if...else结构判断!