RxJava--takeWhile,takeUntil,(附带filter)的特性总结

2,752 阅读1分钟

filter

过滤不满足条件的事件,例如以下代码,只会输出值为6的事件

 PublishSubject<String> subject = PublishSubject.create();

        Disposable disposable = subject
                .compose(new ObservableTransformer<String, String>() {
                    @Override
                    public ObservableSource<String> apply(Observable<String> upstream) {
                    
                        //替换部分
                        return upstream.filter(new Predicate<String>() {
                            @Override
                            public boolean test(String s) throws Exception {
                                LogUtils.e("ObservableTransformer==" + s);
                                return Integer.valueOf(s) == 6;
                            }
                        });
                        //替换部分

                    }
                })
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        LogUtils.e("disposable1==" + s);
                    }
                });
        subject.onNext("1");
        subject.onNext("2");
        subject.onNext("3");
        subject.onNext("4");
        subject.onNext("5");
        subject.onNext("6");
        subject.onNext("7");
        subject.onNext("8");
        subject.onNext("9");
        subject.onNext("10");
        subject.onComplete();



takeUntil

先发送事件,再判断是否符合条件,当符合条件的时候,终止。如下代码。会输出事件 1,2,3,4,5,6

   //替换第一部分代码
 return upstream.takeUntil(new Predicate<String>() {
                           @Override
                           public boolean test(String s) throws Exception {
                               LogUtils.e("ObservableTransformer==" + s);
                               return Integer.valueOf(s) == 6;
                           }
                       });



takeWhile

先判断是否符合条件,再发送事件。当不符合条件的时候,直接终止。如下代码。。

  //替换第一部分代码
 return upstream.takeWhile(new Predicate<String>() {
                           @Override
                           public boolean test(String s) throws Exception {
                               LogUtils.e("ObservableTransformer==" + s);
                               return Integer.valueOf(s) == 6;
                           }
                       });

什么也不会输出。因为当事件1来临时,不等于6,直接终止

若替换代码
return Integer.valueOf(s) != 6;
则会输出事件1,2,3,4,5,事件6不符合条件,终止。