RX操作符之过滤操作二(firstOrDefault、single、elementAt、sample、throttleFirst、throwttleLast、throttleWithTimeout)

一、firstOrDefault

传递一个谓词函数给firstOrDefault,然后发射这个函数判定为true的第一项数据,如果没有数据通过了谓词测试就发射一个默认值。

 Integer[]items = {6,7,81,2,3,4,5};
        Observable myObservable = Observable.from(items)
                .firstOrDefault(88, new Func1<Integer, Boolean>() {
                    @Override
                    public Boolean call(Integer integer) {
                        return integer >85;
                    }
                });
        Subscriber<Integer> mySubscriber =new Subscriber<Integer>() {
            @Override
            public void onNext(Integer integer) {
                System.out.println("onNext................."+integer);
            }

            @Override
            public void onCompleted() {
                System.out.println("onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("onError....................");
            }
        };

        myObservable.subscribe(mySubscriber);
运行结果:

二、takeFirst

takeFirstfirst类似,除了这一点:如果原始Observable没有发射任何满足条件的数据,first会抛出一个NoSuchElementExceptiontakeFist会返回一个空的Observable(不调用onNext()但是会调用onCompleted)。

三、single

如果是无参的函数,发射多个observable则会抛出异常,执行onError()方法,如果只发射一个值会正常执行。

1.正常执行:

Integer[]items = {6};
        Observable myObservable = Observable.from(items)
                .single();
        Subscriber<Integer> mySubscriber =new Subscriber<Integer>() {
            @Override
            public void onNext(Integer integer) {
                System.out.println("onNext................."+integer);
            }

            @Override
            public void onCompleted() {
                System.out.println("onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("onError....................");
            }
        };

        myObservable.subscribe(mySubscriber);


运行结果:


2.运行出错:

 Integer[]items = {6,7,81,2,3,4,5};                    
        Observable myObservable = Observable.from(items)
                .single();
        Subscriber<Integer> mySubscriber =new Subscriber<Integer>() {
            @Override
            public void onNext(Integer integer) {
                System.out.println("onNext................."+integer);
            }

            @Override
            public void onCompleted() {
                System.out.println("onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("onError....................");
            }
        };

        myObservable.subscribe(mySubscriber);

运行结果:

四、elementAt

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

Integer[]items = {6,7,81,2,3,4,5};
        Observable myObservable = Observable.from(items)
                .elementAt(5);
        Subscriber<Integer> mySubscriber =new Subscriber<Integer>() {
            @Override
            public void onNext(Integer integer) {
                System.out.println("onNext................."+integer);
            }

            @Override
            public void onCompleted() {
                System.out.println("onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("onError....................");
            }
        };

        myObservable.subscribe(mySubscriber);
运行结果:



五、elementAtOrDefault

elementAtOrDefault操作符与elementAt的区别是,如果索引值大于数据项数,它会发射一个默认值(通过额外的参数指定),而不是抛出异常。但是如果你传递一个负数索引值,它仍然会抛出一个IndexOutOfBoundsException异常。

六、sample

定期发射Observable最近发射的数据项,Sample操作符定时查看一个Observable,然后发射自上次采样以来它最近发射的数据。

 Integer[]items = {6,7,81,2,3,4,5};

        Observable<Integer> myObservable =  Observable.create(new Observable.OnSubscribe<Integer>() {

            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for(int i=0;i<5;i++){
                    subscriber.onNext(i);
                    try{
                        Thread.sleep(1000);
                    }catch (Exception e){

                    }
                }
                subscriber.onCompleted();
            }
        });

        Subscriber<Integer> mySubscriber =new Subscriber<Integer>() {
            @Override
            public void onNext(Integer integer) {
                System.out.println("onNext................."+integer);
            }

            @Override
            public void onCompleted() {
                System.out.println("onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("onError....................");
            }
        };

        myObservable.sample(3,TimeUnit.SECONDS).subscribe(mySubscriber);


运行结果:
代码中每隔1s发射一次数据,共5次,订阅时3s订阅一次,于是只取出了第3s发射的数据的值2



七、throttleFirst


throttleFirstthrottleLast/sample不同,在每个采样周期内,它总是发射原始Observable的第一项数据,而不是最近的一项。

        Integer[]items = {6,7,81,2,3,4,5};

        Observable<Integer> myObservable =  Observable.create(new Observable.OnSubscribe<Integer>() {

            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for(int i=0;i<5;i++){
                    subscriber.onNext(i);
                    try{
                        Thread.sleep(1000);
                    }catch (Exception e){

                    }
                }
                subscriber.onCompleted();
            }
        });

        Subscriber<Integer> mySubscriber =new Subscriber<Integer>() {
            @Override
            public void onNext(Integer integer) {
                Log.e(TAG,"onNext................."+integer);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        myObservable.throttleFirst(2, TimeUnit.SECONDS).subscribe(mySubscriber);

运行结果:


八、throwttleLast

throttleFirst在每个采样周期内,它总是发射原始Observable的最后一项数据,而不是最近的一项。

Integer[]items = {6,7,81,2,3,4,5};

        Observable<Integer> myObservable =  Observable.create(new Observable.OnSubscribe<Integer>() {

            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for(int i=0;i<5;i++){
                    subscriber.onNext(i);
                    try{
                        Thread.sleep(1000);
                    }catch (Exception e){

                    }
                }
                subscriber.onCompleted();
            }
        });

        Subscriber<Integer> mySubscriber =new Subscriber<Integer>() {
            @Override
            public void onNext(Integer integer) {
                Log.e(TAG,"onNext................."+integer);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        myObservable.throttleLast(2, TimeUnit.SECONDS).subscribe(mySubscriber);

运行结果:


九、throttleWithTimeout

根据指定的时间间隔进行限流,时间单位通过TimeUnit参数指定。这种操作符默认在computation调度器上执行,但是你可以通过第三个参数指定。

 Observable<Integer> myObservable =  Observable.create(new Observable.OnSubscribe<Integer>() {

            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for (int i = 0; i < 5; i++) {
                    subscriber.onNext(i);
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) {

                    }
                }
                subscriber.onCompleted();
            }
        });

        Subscriber<Integer> mySubscriber =new Subscriber<Integer>() {
            @Override
            public void onNext(Integer integer) {
                Log.e(TAG,"onNext................."+integer);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        myObservable.throttleWithTimeout(2, TimeUnit.SECONDS).subscribe(mySubscriber);
    }

    private void testThrottleLast() {
        Integer[]items = {6,7,81,2,3,4,5};

        Observable<Integer> myObservable =  Observable.create(new Observable.OnSubscribe<Integer>() {

            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for(int i=0;i<5;i++){
                    subscriber.onNext(i);
                    try{
                        Thread.sleep(1000);
                    }catch (Exception e){

                    }
                }
                subscriber.onCompleted();
            }
        });

        Subscriber<Integer> mySubscriber =new Subscriber<Integer>() {
            @Override
            public void onNext(Integer integer) {
                Log.e(TAG,"onNext................."+integer);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        myObservable.throttleLast(2, TimeUnit.SECONDS).subscribe(mySubscriber);

运行结果:


十、timeout

对原始Observable的一个镜像,如果过了一个指定的时长仍没有发射数据,它会发一个错误通知

 Observable<Integer> myObservable =  Observable.create(new Observable.OnSubscribe<Integer>() {

            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for (int i = 0; i < 5; i++) {
                    subscriber.onNext(i);
                    try {
                        Thread.sleep(100*i);
                    } catch (Exception e) {

                    }
                }
                subscriber.onCompleted();
            }
        });

        Subscriber<Integer> mySubscriber =new Subscriber<Integer>() {
            @Override
            public void onNext(Integer integer) {
                Log.e(TAG,"onNext................."+integer);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        myObservable.timeout(300, TimeUnit.MILLISECONDS).subscribe(mySubscriber);

运行结果:



十一、distinct

抑制(过滤掉)重复的数据项

 Integer[]items = {6,6,6,6,7,8,2,2,2,3,4,5};

        Observable<Integer> myObservable =  Observable.from(items);

        Subscriber<Integer> mySubscriber =new Subscriber<Integer>() {
            @Override
            public void onNext(Integer integer) {
                Log.e(TAG,"onNext................."+integer);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        myObservable.distinct().subscribe(mySubscriber);

运行结果:



十二、distinctUntilChanged

过滤掉连续重复的数据

 Integer[]items = {6,6,5,6,6,7,8,2,2,2,3,4,5};

        Observable<Integer> myObservable =  Observable.from(items);

        Subscriber<Integer> mySubscriber =new Subscriber<Integer>() {
            @Override
            public void onNext(Integer integer) {
                Log.e(TAG,"onNext................."+integer);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        myObservable.distinctUntilChanged().subscribe(mySubscriber);

运行结果:



十三、ignoreElements

IgnoreElements操作符抑制原始Observable发射的所有数据,只允许它的终止通知(onErroronCompleted)通过。

如果你不关心一个Observable发射的数据,但是希望在它完成时或遇到错误终止时收到通知,你可以对Observable使用ignoreElements操作符,它会确保永远不会调用观察者的onNext()方法。

 Observable<Integer> myObservable =  Observable.create(new Observable.OnSubscribe<Integer>() {

            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for (int i = 0; i < 5; i++) {
                    subscriber.onNext(i);
                    try {
                        Thread.sleep(100*i);
                    } catch (Exception e) {

                    }
                }
                subscriber.onCompleted();
            }
        });

        Subscriber<Integer> mySubscriber =new Subscriber<Integer>() {
            @Override
            public void onNext(Integer integer) {
                Log.e(TAG,"onNext................."+integer);
            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        myObservable.ignoreElements().subscribe(mySubscriber);

运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值