Android从零开始学习Rxjava2(六)—— 过滤运算符

本文详细介绍了RxJava2中的过滤运算符,包括Debounce、Distinct、DistinctUntilChanged、Filter、Sample/ThrottleLast等,通过具体示例展示了如何使用这些运算符来筛选、去重、过滤和定时采样数据流。
摘要由CSDN通过智能技术生成

rxjava2过滤运算符

筛选源Observable发出的项的运算符。

Debounce

如果特定的时间跨度已经过去而没有发出另一个项目,则从Observable中发出这一个项目。
在这里插入图片描述
debounce主要是防抖。如果在短时间内连续更改并且我们只要最终结果,中间更改的数据对我们来说没有用,需要忽略掉,则debounce是很有效的一个运算符。
debounce的防抖动时间片段是在元素发射之后重新计算的,比如上图黄色圆发射之后,在防抖动时间之内发射第二个绿色的圆,防抖动时间会从绿色的圆开始重新计时。

举个例子:去抖500ms内连续发射的元素,只发射最后一个。

private void doSomeWork() {
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                // send events with simulated time wait
                emitter.onNext(1); // skip
                Thread.sleep(400);
                emitter.onNext(2); // deliver
                Thread.sleep(505);
                emitter.onNext(3); // skip
                Thread.sleep(100);
                emitter.onNext(4); // deliver
                Thread.sleep(605);
                emitter.onNext(5); // deliver
                Thread.sleep(510);
                emitter.onComplete();
            }
        }).debounce(500, TimeUnit.MILLISECONDS)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.d(TAG, " accept : integer : " + integer);
                    }
                });
    }

打印结果

accept : integer : 2
accept : integer : 4
accept : integer : 5

Distinct

抑制Observable发出的重复项。
在这里插入图片描述
distinct 只允许不同的数据发射出来,去除重复已经发射过的数据。
举个例子:

private void doSomeWork() {
        Observable.just(1, 2, 1, 1, 2, 3, 4, 6, 4)
                .distinct()
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.d(TAG, " accept : integer : " + integer);
                    }
                });
    }

打印结果,distinct会将已经发送过的数据忽略掉,所以第三、四、五个元素被去重掉了。

accept : integer : 1
accept : integer : 2
accept : integer : 3
accept : integer : 4
accept : integer : 6

当然distinct不仅仅简单的去除重复数据,也可以设置去重条件,根据条件去重。
在这里插入图片描述
举个例子,去除姓名相同的数据:

public class Person{
        String name = "";
        String sex = "";

        public Person(String name, String sex) {
            this.name = name;
            this.sex = sex;
        }
    }

    private void doSomeWork() {
        Observable.just(new Person("张三", "男"), new Person("李四", "男"),
                new Person("张三", "女"), new Person("李四", "男"), new Person("王五", "女"))
                .distinct(new Function<Person, String>() {
                    @Override
                    public String apply(Person person) throws Exception {
                        return person.name;//去重条件,去除后面发射的姓名相同的元素
                    }
                }).subscribe(new Consumer<Person>() {
            @Override
            public void accept(Person person) throws Exception {
                Log.d(TAG, " accept : name : " + person.name + ",sex :" + person.sex);
            }
        });
    }

打印结果

accept : name : 张三,sex :男
accept : name : 李四,sex :男
accept : name : 王五,sex :

distinctUntilChanged

RxGroovy还实现了distinctUntilChanged运算符。 它仅将源Observable中的发射项与其前一个前辈进行比较,以确定它们是否是不同的。
在这里插入图片描述
distinctUntilChanged与distinct类似也是去除重复的元素,也可以自己设置去重的条件,但distinctUntilChanged与distinct不同之处在于distinctUntilChanged它只是将要发射的元素与前一个元素比较,来判断是否需要去除;distinct会将要发射的元素与之前所有元素比较,来判断是否需要去除。
将上方的例子进行更改:

private void doSomeWork() {
        Observable.just(1, 2, 1, 1, 2, 3, 4, 6, 4)
                .distinctUntilChanged()
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.d(TAG, " accept : integer : " + integer);
                    }
                });
    }

打印结果

accept : integer : 1
accept : integer : 2
accept : integer : 1
accept : integer : 2
accept : integer : 3
accept : integer : 4
accept : integer : 6
accept : integer : 4

Filter

过滤运算符,以特定条件过滤发射的元素。
在这里插入图片描述
举个例子,筛选出0到9中到偶数:

private void doSomeWork() {
        Observable.range(0, 10)
                .filter(new Predicate<Integer>() {
                    @Override
                    public boolean test(Integer integer) throws Exception {
                        return integer % 2 == 0;//筛选条件
                    }
                })
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.d(TAG, " accept : integer : " + integer);
                    }
                });
    }

打印结果

accept : integer : 0
accept : integer : 2
accept : integer : 4
accept : integer : 6
accept : integer : 8

sample / throttleLast

在定期时间间隔内发出Observable发出的最新项目。Sample运算符定期查看Observable并发出自上次采样以来最近发出的任何项目。
在这里插入图片描述
举个例子:

private void doSomeWork() {
        Observable.interval(100, TimeUnit.MILLISECONDS).take(10)
                .sample(300,TimeUnit.MILLISECONDS)
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        Log.d(TAG, " accept : aLong : " + aLong);
                    }
                });
    }

打印结果

accept : aLong : 2
accept : aLong : 4
accept : aLong : 7

sample和throttleLast的作用效果一样,都是只发射出定期间隔期内所缓冲所有元素里最后一个元素。与之相对应的是throttleFirst,会发射出定期间隔期内所缓冲所有元素里第一个元素。
在这里插入图片描述
例子就不再重复写了,想测试可以将上面改下,比较简单。打印结果:

accept : aLong : 0
accept : aLong : 4
accept : aLong : 8

还有其他一些过滤运算符比如Last、Skip、Take 等,可以根据名字就知道其准确的用法,我就不一一写出来了。


参考资料,参考但不局限以下链接
http://reactivex.io/documentation/operators.html#transforming

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值