RxJava操作符(3)-过滤

Debounce

Debonuce操作符可以通过时间进行过滤,也可以通过函数进行过滤。通过时间进行过滤时,Observable每次发射一个数据出去时,都会进行记时,如果在规定的时间内,Observable发射出一个新的数据,那么老的数据将会被丢弃,如果发射的时机一直都是这样,那么最后只能成功发射出去最后一个数据。通过函数进行过滤时,会生成一个新的
Observable,如果此时原Observable发射一个新数据,而此时上一次的Observable还没操作完成,则上一次的Observable将会被丢弃。

原理图如下:


Debounce操作符使用如下:

通过时间进行过滤:
    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for (int i = 0; i < 5; i++) {
                    if (i % 2 == 0) {
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    if (!subscriber.isUnsubscribed()) {
                        subscriber.onNext(i);
                    }
                }
                subscriber.onCompleted();
            }
        }).subscribeOn(Schedulers.computation())
                .debounce(1, TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread());
    }
通过函数进行过滤:
    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.just(1, 2, 3, 4, 5, 6).debounce(new Func1<Integer, Observable<Integer>>() {
            @Override
            public Observable<Integer> call(final Integer integer) {
                return Observable.create(new Observable.OnSubscribe<Integer>() {
                    @Override
                    public void call(Subscriber<? super Integer> subscriber) {
                        if (integer % 2 == 0 && !subscriber.isUnsubscribed()) {
                            subscriber.onNext(integer);
                            subscriber.onCompleted();
                        }
                    }
                });
            }
        });
    }
运行代码,结果如下:
     

Distinct

Distinct操作符进行数据出重的操作。

原理图如下:


Distinct操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.just(1, 2, 2, 3, 2, 2, 3, 4, 5, 6).distinct();
    }
运行代码,结果如下:

DistinctUtilChanged

DistinctUtilChanged操作符对连续的数据进行出重的操作。

原理图如下:


DistinctUntilChanged操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.just(1, 2, 2, 3, 2, 2, 3, 4, 5, 6)
                .distinctUntilChanged();
    }
运行代码,结果如下:

ElementAt

ElementAt操作符获取原始Observable发射的数据序列指定索引位置的数据项,然后当做自己的唯一数据发射。

原理图如下:


ElementAt操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.just(1, 2, 3, 4).elementAt(3);
    }
运行代码,结果如下:

ElementAtOrDefault

ElementAtOrDefault操作符当索引位置不超过Observable发射的数据序列的大小时,功能跟ElementAt操作符一样,当超过时会以一个默认值返回。如果索引位置为负数,将会抛出数组越界的异常。

原理图如下:


ElementAtOrDefault操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.just(1, 2, 3, 4, 5)
                .elementAtOrDefault(6, 6);
    }
运行代码,结果如下:

Filter

Filter操作符是传入一个函数,当发射出去的数据满足该函数的条件时,才被Filter操作符发射出去,如果不满足数据将会被过滤。

原理图如下:


Filter操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.just(1, 2, 3, 4, 5).filter(new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer integer) {
                if (integer % 2 == 0) {
                    return true;
                }
                return false;
            }
        });
    }
运行代码,结果如下:

OfType

OfType操作符传入class,只返回属于该class类型的数据。

原理图如下:


OfType操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.just(1, 2.0, 3d).ofType(Integer.class);
    }
运行代码,结果如下:

First

First操作符是返回第一条满足条件的数据。

原理图如下:


First操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.just(1, 2.0, 3d).first();
    }
运行代码,结果如下:

Last

Last操作符是返回最后一条满足条件的数据。

原理图如下:


Last操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.just(1, 2, 3).last();
    }
运行代码,结果如下:

Skip

Skip操作符是过滤调前m项数据。假设要发射数据的列表是n,而skip传入的参数是m,则Skip操作符只会发射[n-m, n]这个区间的数据。TakeLast操作符只取后面的m项数据,如果传入的数据是TakeLast(n-m),则跟Skip(m)发射出去的数据是一样的。

原理图如下:


Skip操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.just(1, 2, 3, 4, 5, 6).skip(3);
    }
运行代码,结果如下:

Take

Take操作符是只取前m项数据。假设要发射数据的列表是n,而take传入的参数是m,则Take操作符只会发射[1, m]这个区间的数据。SkipLast操作符只取前面的m项数据,如果传入的数据是SkipLast(n-m),则跟Take(m)发射出去的数据是一样的。

原理图如下:


Take操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.just(1, 2, 3, 4, 5, 6).take(3);
    }
运行代码,结果如下:

Sample

Sample操作符在每个采样周期内,它总是发射原始Observable的最近发射的数据。

原理图如下:


Sample操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.interval(1, TimeUnit.SECONDS)
                .sample(5, TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread());
    }
运行代码,结果如下:

ThrottleFirst

ThrottleFirst操作符在每个采样周期内,它总是发射原始Observable的第一个数据。

原理图如下:


ThrottleFirst操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = Observable.interval(1, TimeUnit.SECONDS)
                .throttleFirst(5, TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread());
    }
运行代码,结果如下:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值