RX操作之条件和布操作符(amb、defaultIfEmpty、skipUntil、skipWhile、takeUntil、takeWhile、contains、all、exists、isEmpty)

来源:互联网 发布:linux安装telnet 编辑:程序博客网 时间:2024/06/14 05:19

一、amb

当你传递多个Observable给Amb时,它只发射其中一个Observable的数据和通知:首先发送通知给Amb的那个,不管发射的是一项数据还是一个onErroronCompleted通知。Amb将忽略和丢弃其它所有Observables的发射物。

Long[]items = {6l,7l,8l,9l,10l};        Observable<Long> observable = Observable.interval(2, TimeUnit.SECONDS).take(5);        Observable<Long> observable1 = Observable.from(items);        Subscriber<Long> subscriber = new Subscriber<Long>() {            @Override            public void onNext(Long v) {                Log.e(TAG, "onNext................." + v);            }            @Override            public void onCompleted() {                Log.e(TAG, "onCompleted.................");            }            @Override            public void onError(Throwable e) {                Log.e(TAG, "onError.....................");            }        };        Observable.amb(observable,observable1).subscribe(subscriber);

运行结果:


二、defaultIfEmpty

发射来自原始Observable的值,如果原始Observable没有发射任何值,就发射一个默认值。DefaultIfEmpty简单的精确地发射原始Observable的值,如果原始Observable没有发射任何数据正常终止(以onCompletedd的形式),DefaultIfEmpty返回的Observable就发射一个你提供的默认值。

Long[]items ={};        Observable<Long> observable = Observable.from(items);        Subscriber<Long> subscriber = new Subscriber<Long>() {            @Override            public void onNext(Long v) {                if(v == 1000){                    Log.e(TAG, "onNext.................发射了默认的值:" + v);                }else {                    Log.e(TAG, "onNext................." + v);                }            }            @Override            public void onCompleted() {                Log.e(TAG, "onCompleted.................");            }            @Override            public void onError(Throwable e) {                Log.e(TAG, "onError.....................");            }        };        observable.defaultIfEmpty(1000l).subscribe(subscriber);

运行结果:


三、skipUntil

丢弃原始Observable发射的数据,直到第二个Observable发射了一项数据

 //所需发射的数据,在observable1发射之前的数据将会被丢失        Observable <Long> observable = Observable.interval(2,TimeUnit.SECONDS).take(5);        //当此observale发射数据时,observable的数据才会被传递到onNext中        Observable <Long> observable1 = Observable.interval(5,TimeUnit.SECONDS).take(5);        Subscriber<Long> subscriber = new Subscriber<Long>() {            @Override            public void onNext(Long v) {                Log.e(TAG, "onNext................." + v);            }            @Override            public void onCompleted() {                Log.e(TAG, "onCompleted.................");            }            @Override            public void onError(Throwable e) {                Log.e(TAG, "onError.....................");            }        };        observable                .skipUntil(observable1)                .subscribe(subscriber);
运行结果:



四、skipWhile

当条件不满足时执行,SkipWhile订阅原始的Observable,但是忽略它的发射物,直到你指定的某个条件变为false的那一刻,它开始发射原始Observable。

Observable <Long> observable = Observable.interval(2,TimeUnit.SECONDS).take(5);        Subscriber<Long> subscriber = new Subscriber<Long>() {            @Override            public void onNext(Long v) {                Log.e(TAG, "onNext................." + v);            }            @Override            public void onCompleted() {                Log.e(TAG, "onCompleted.................");            }            @Override            public void onError(Throwable e) {                Log.e(TAG, "onError.....................");            }        };        observable                .skipWhile(new Func1<Long, Boolean>() {                    @Override                    public Boolean call(Long aLong) {                        return aLong < 4;                    }                })                .subscribe(subscriber);
执行结果:



五、takeUntil

当第二个Observable发射了一项数据或者终止时,丢弃原始Observable发射的任何数据。TakeUntil订阅并开始发射原始Observable,它还监视你提供的第二个Observable。如果第二个Observable发射了一项数据或者发射了一个终止通知,TakeUntil返回的Observable会停止发射原始Observable并终止。

注:第二个Observable发射一项数据或一个onError通知或一个onCompleted通知都会导致takeUntil停止发射数据

//所需发射的数据,在observable1发射后数据将会被丢失        Observable <Long> observable = Observable.interval(2,TimeUnit.SECONDS).take(5);        //当此observale发射数据时,observable的数据还未被发射的将会被丢失        Observable <Long> observable1 = Observable.interval(5,TimeUnit.SECONDS).take(5);        Subscriber<Long> subscriber = new Subscriber<Long>() {            @Override            public void onNext(Long v) {                Log.e(TAG, "onNext................." + v);            }            @Override            public void onCompleted() {                Log.e(TAG, "onCompleted.................");            }            @Override            public void onError(Throwable e) {                Log.e(TAG, "onError.....................");            }        };        observable                .takeUntil(observable1)                .subscribe(subscriber);
运行结果:



六、takeWhile

发射Observable发射的数据,直到一个指定的条件不成立。TakeWhile发射原始Observable,直到你指定的某个条件不成立的那一刻,它停止发射原始Observable,并终止自己的Observable。takeWhile操作符返回一个镜像原始Observable行为的Observable,直到某一项数据你指定的函数返回false那一刻,这个新的Observable发射onCompleted终止通知。

 Observable <Long> observable = Observable.interval(1,TimeUnit.SECONDS).take(5);        Subscriber<Long> subscriber = new Subscriber<Long>() {            @Override            public void onNext(Long v) {                Log.e(TAG, "onNext................." + v);            }            @Override            public void onCompleted() {                Log.e(TAG, "onCompleted.................");            }            @Override            public void onError(Throwable e) {                Log.e(TAG, "onError.....................");            }        };        observable                .takeWhile(new Func1<Long, Boolean>() {                    @Override                    public Boolean call(Long aLong) {                        return aLong<4;                    }                })                .subscribe(subscriber);

运行结果:


七、all

判断是否所发射的所有数据都满足某个条件

 Observable <Long> observable = Observable.interval(1,TimeUnit.SECONDS).take(5);        Subscriber<Boolean> subscriber = new Subscriber<Boolean>() {            @Override            public void onNext(Boolean v) {                Log.e(TAG, "onNext................." + v);            }            @Override            public void onCompleted() {                Log.e(TAG, "onCompleted.................");            }            @Override            public void onError(Throwable e) {                Log.e(TAG, "onError.....................");            }        };        observable                .all(new Func1<Long, Boolean>() {                    @Override                    public Boolean call(Long aLong) {                        return aLong > 4;                    }                })                .subscribe(subscriber);


运行结果:



八、contains

判断所发射的数据是否包含某个值

 Observable <Integer> observable = Observable.just(1, 2, 3, 4, 5);        Subscriber<Boolean> subscriber = new Subscriber<Boolean>() {            @Override            public void onNext(Boolean v) {                Log.e(TAG, "onNext................." + v);            }            @Override            public void onCompleted() {                Log.e(TAG, "onCompleted.................");            }            @Override            public void onError(Throwable e) {                Log.e(TAG, "onError.....................");            }        };        observable                .contains(4)                .subscribe(subscriber);

运行结果:



九、exists

只要有任何一项满足条件就返回true

 Observable <Integer> observable = Observable.just(1, 2, 3, 4, 5);        Subscriber<Boolean> subscriber = new Subscriber<Boolean>() {            @Override            public void onNext(Boolean v) {                Log.e(TAG, "onNext................." + v);            }            @Override            public void onCompleted() {                Log.e(TAG, "onCompleted.................");            }            @Override            public void onError(Throwable e) {                Log.e(TAG, "onError.....................");            }        };        observable                .exists(new Func1<Integer, Boolean>() {                    @Override                    public Boolean call(Integer integer) {                        return integer >=5;                    }                })                .subscribe(subscriber);

运行结果:


十、isEmpty

判断所发射的Observable是否为空

 Observable <Integer> observable = Observable.just(1, 2, 3, 4, 5);        Subscriber<Boolean> subscriber = new Subscriber<Boolean>() {            @Override            public void onNext(Boolean v) {                Log.e(TAG, "onNext................." + v);            }            @Override            public void onCompleted() {                Log.e(TAG, "onCompleted.................");            }            @Override            public void onError(Throwable e) {                Log.e(TAG, "onError.....................");            }        };        observable                .isEmpty()                .subscribe(subscriber);
运行结果:



0 0
原创粉丝点击