过滤操作符主要在Android中用户点击事件的过滤以及一些列表的过滤操作
Debounce 防抖动
在一段时间内仅发出一个事件, 它的实现是throttleFirst 与 debounce,View的点击事件还需要使用rxbinding这个库
debounce.png
protected 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
Distinct 过滤到重复的数据
distinct.png
Observable.just("Android", "android", "Rxjava", "iOS", "RXJAVA", "Java")
.map(s -> s.toLowerCase()) // 将所有的单词转换成小写
.distinct()
.subscribe(new Observer() {
@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() {
@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() {
@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() {
@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() {
@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.png
Observable.just(1, 2, 3, 4)
.filter(new Predicate() {
@Override
public boolean test(Integer integer) throws Exception {
return integer > 2;
}
})
.subscribe(new Observer() {
@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() {
@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.png
Observable.just(4, 5, 6, 6)
.first(1)
.subscribe(new BiConsumer() {
@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.png
Observable.just(5, 6, 7, 8)
.last(-1)
.subscribe(new Consumer() {
@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.png
RxView.clicks(btn)
.sample(2, TimeUnit.SECONDS)
.subscribe(new Observer
Skip 抑制数据源的前N项
skip.png
Observable.just(11, 22, 33, 44)
.skip(3)
.subscribe(new Observer() {
@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.png
Observable.just(11, 22, 33, 44)
.skipLast(2)
.subscribe(new Observer() {
@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.png
Observable.just(11, 22, 33, 44)
.take(3)
.subscribe(new Observer() {
@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.png
Observable.just(11, 22, 33, 44)
.takeLast(3)
.subscribe(new Observer() {
@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结构判断!