Android RxJava2(六)条件操作符

Rxjava由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。因此在学习过程中全面的了解了下RxJava的条件操作符

all()

方法:

public final Single<Boolean> all(Predicate<? super T> predicate)

作用:
判断被观察者所有事件是否满足某个事件,如果全部满足则返回true,都在返回false
代码:

        Observable.just(1,3,5).all(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) throws Exception {
                return integer % 2 == 1;
            }
        }).subscribe(new Consumer<Boolean>() {// Consumer是简易版的Observer,这里调用的只接收onNext方法
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                Log.e("---","accept:"+aBoolean);
            }
        });

打印结果:

E/---: accept:true

takeUntil()

原理图:
这里写图片描述
方法:

public final Observable<T> takeUntil(Predicate<? super T> stopPredicate) 

作用:
当事件满足设定的条件时,该事件的下一个事件不会被发送了。也就是说当condition == false的时候终止,包含临界条件的item
代码:

        Observable.just(1,3,5).takeUntil(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) throws Exception {
                return integer > 2;
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e("---","accept:"+integer);
            }
        });

打印结果:

E/---: accept:1
       accept:3

skipUntil()

原理图:

这里写图片描述
方法:

public final <U> Observable<T> skipUntil(ObservableSource<U> other)

作用:
当skipUntil里面的参数Observable发送事件的时候,源被观察者才会发送事件。
代码:

        Observable.intervalRange(1,10,1,1,TimeUnit.SECONDS)
                .skipUntil(Observable.intervalRange(20,3,5,1,TimeUnit.SECONDS))
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        Log.e("---","accept:"+aLong);
                    }
                });

结果打印:

06-08 14:17:43.340 26552-26577/ E/---: accept:6
06-08 14:17:44.340 26552-26577/ E/---: accept:7
06-08 14:17:45.340 26552-26577/ E/---: accept:8
06-08 14:17:46.340 26552-26577/ E/---: accept:9
06-08 14:17:47.340 26552-26577/ E/---: accept:10

从上面打印结果可以发现,观察者接收到的数据和skipUntil的参数被观察者发送的数据没有关系,仍然是源被观察者数据。

takeWhile()

原理图:
这里写图片描述
方法:

public final Observable<T> takeWhile(Predicate<? super T> predicate)

作用:
可以设置条件,当某个数据满足条件时就会发送该数据,反之则不发送。当condition == false的时候终止,不包含临界条件的item
代码:

        Observable.just(1,2,3,4).takeWhile(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) throws Exception {
                return integer < 3;
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e("---","accept:"+integer);
            }
        });

打印结果:

E/---: accept:1
       accept:2

skipWhile()

原理图:
这里写图片描述
方法:

public final Observable<T> skipWhile(Predicate<? super T> predicate)

作用:
可以设置条件,当某个数据满足条件时不发送该数据,反之则发送。
代码:

        Observable.just(1,2,3,4).skipWhile(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) throws Exception {
                return integer < 3;
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e("---","accept:"+integer);
            }
        });

打印结果:

E/---: accept:3
       accept:4

sequenceEqual()

原理图:
这里写图片描述
方法:

public static <T> Single<Boolean> sequenceEqual(ObservableSource<? extends T> source1, ObservableSource<? extends T> source2)

作用:
判断两个 Observable 发送的事件是否相同。
代码:

        Observable.sequenceEqual(Observable.just(1,2),Observable.just(1,2))
                .subscribe(new Consumer<Boolean>() {
                    @Override
                    public void accept(Boolean aBoolean) throws Exception {
                        Log.e("---","accept:"+aBoolean);
                    }
                });

结果打印:

E/---: accept:true

contains()

原理图:
这里写图片描述
方法:

public final Single<Boolean> contains(final Object element)

作用:
判断发送的事件中是否包含某个元素,有则返回true
代码:

        Observable.just(1,3,5).contains(3).subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                Log.e("---","accept:"+aBoolean);
            }
        });

打印结果:

E/---: accept:true

isEmpty()

原理图:
这里写图片描述
方法:

public final Single<Boolean> isEmpty()

作用:
判断事件序列是否为空。
代码:

Observable.create(new ObservableOnSubscribe < Integer > () {
    @Override
    public void subscribe(ObservableEmitter < Integer > e) throws Exception {
        e.onComplete();
    }
})
.isEmpty()
.subscribe(new Consumer < Boolean > () {
    @Override
    public void accept(Boolean aBoolean) throws Exception {
       Log.e("---","accept:"+aBoolean);
    }
});

结果打印:

Log.e("---","accept:"+aBoolean);

defaultIfEmpty()

方法:

public final Observable<T> defaultIfEmpty(T defaultItem)

作用:
如果观察者只发送一个 onComplete() 事件,则可以利用这个方法发送一个值。
代码:

Observable.create(new ObservableOnSubscribe < Integer > () {
    @Override
    public void subscribe(ObservableEmitter < Integer > e) throws Exception {
        e.onComplete();
    }
})
.defaultIfEmpty(666)
.subscribe(new Consumer < Integer > () {
    @Override
    public void accept(Integer integer) throws Exception {
        Log.d( "---""---"+integer);
    }
});

打印结果:

E/---: ---666

amb()

原理图:
这里写图片描述
方法:

public static <T> Observable<T> amb(Iterable<? extends ObservableSource<? extends T>> sources)

作用:
amb() 要传入一个 Observable 集合,但是只会发送最先发送事件的 Observable 中的事件,其余 Observable 将会被丢弃。
代码:

        List<Observable<Long>> list = new ArrayList<>();
        list.add(Observable.intervalRange(5,3,5,1,TimeUnit.SECONDS));
        list.add(Observable.intervalRange(1,3,3,1,TimeUnit.SECONDS));
        Observable.amb(list).subscribe(new Consumer<Long>() {

            @Override
            public void accept(Long aLong) throws Exception {
                Log.e("---","accept:"+aLong);
            }
        });

打印结果:

06-08 16:00:17.961 10456-10481/ E/---: accept:1
06-08 16:00:18.961 10456-10481/ E/---: accept:2
06-08 16:00:19.958 10456-10481/ E/---: accept:3
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值