Rxjava2操作符学习(过滤操作符)

过滤操作符主要在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() {
                @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.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() {
            @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.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结构判断!

你可能感兴趣的:(Rxjava2操作符学习(过滤操作符))