RxJava操作符简记

RxJava2 Flowable 静态操作符 RxJava的学习成本其实蛮高的,我写RxJava这个系列是希望缩短学习RxJava的时间,我这里完全根据官网来学习一遍,写用例,做笔记,对于对英文不太感冒的同学,我相信看我的博客可以舒服不少! 国庆两天假初步整理了一下Flowable的静态操作符,后续将会继续写Flowable的实例操作符,Observable、Single、Completable、Maybe操作符以及对各操作符的分类和总结,... 阅读详情

官方文档

RxAndroid源码

ProgressOn思维导图
image

一、创建操作符

1、create操作符

创建一个被观察者Observable对象

Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
    }
});
2、just操作符
  1. 快速创建一个被观察者Observable对象
  2. 创建完成之后直接将just()方法的参数发送给观察者
  3. just()有十个重载方法,最少一个参数,最多十个参数。
  Observable
    .just(1, 2, 3, 4)
    .subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
        }

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

        @Override
        public void onError(Throwable e) {
            Log.e("=========", "===onError==>" +e.getMessage());
        }

        @Override
        public void onComplete() {
            Log.e("=========", "===onComplete==>");
        }
    });

打印结果为:

 ===onNext==>1
 ===onNext==>2
 ===onNext==>3
 ===onNext==>4
 ===onComplete==>
3、fromArray操作符
  • 快速创建一个Observable对象
  • 直接发送传入的变长数组,遍历数组
  Observable
    .fromArray(1,2,3,4)
    .subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
        }
        @Override
        public void onNext(Integer integer) {
            Log.e("=========", "===onNext==>" + integer);
        }
        @Override
        public void onError(Throwable e) {
            Log.e("=========", "===onError==>" +e.getMessage());
        }
        @Override
        public void onComplete() {
            Log.e("=========", "===onComplete==>");
        }
    });

打印结果:

 ===onNext==>1
 ===onNext==>2
 ===onNext==>3
 ===onNext==>4
 ===onComplete==>
4、fromIterable操作符
  • 快速创建一个Observable对象
  • 直接发送传入的集合,遍历集合
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Observable
    .fromIterable(list)
    .subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
        }
        @Override
        public void onNext(Integer integer) {
            Log.e("=========", "===onNext==>" + integer);
        }
        @Override
        public void onError(Throwable e) {
            Log.e("=========", "===onError==>" +e.getMessage());
        }
        @Override
        public void onComplete() {
            Log.e("=========", "===onComplete==>");
        }
    });

打印结果:

 ===onNext==>1
 ===onNext==>2
 ===onNext==>3
 ===onNext==>4
 ===onComplete==>

二、变换操作符

1、map操作符

map操作符的作用是将被观察者Observable发送的数据在apply()方法中转化成自己需要的返回到下游Observer的onNext()方法中。例:

Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onNext(4);
                emitter.onComplete();
            }
        }).map(new Function<Integer, String>() {
            @Override
            public String apply(Integer s) throws Exception {
                if (s > 2) {
                    return "aaa";
                }
                return "bbb";
            }
        }).subscribe(new Observer<String>() {
            ...
            @Override
            public void onNext(String s) {
                Log.e("==============", "===onNext==>" + s);
            }
            ...
        });

map操作符将Observable发送的Integer类型参数1、2、3、4通过条件判断转化成"aaa"、”bbb"返回到Observer的onNext()方法中。

2、flatMap操作符

将Observable发射的数据在apply()方法中接收后转化为新的Observable发射出去,每接收一个数据发送一个新的Observable。flatMap和map操作符很相像,flatMap发送的是合并后的Observables,map操作符发送的是应用函数后返回的结果集。

还有一些重载方法以后再说

Observable
    .create((ObservableOnSubscribe<String>) emitter -> {
        emitter.onNext("1");
        emitter.onNext("2");
        emitter.onNext("3");
        emitter.onNext("4");
        emitter.onComplete();
    })
    .flatMap((Function<String, ObservableSource<Integer>>) s -> {
        Log.e("=================", "==apply==>" + s);//1,2,3,4
        int apply = Integer.valueOf(s);
        return apply > 2 ? Observable.create(emitter -> {
            emitter.onNext(2);
            emitter.onComplete();
        }) : Observable.create(emitter -> {
            emitter.onNext(1);
            emitter.onComplete();
        });
    })
    .subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(Integer integer) {
            Log.e("=================", "==onNext==>" + integer);//1,1,2,2
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {
            Log.e("=================", "==onComplete==>");
        }
    });
3、concatMap操作符

与flatMap操作符功能相同

与flatMap操作符的区别:flatMap操作符

4、switchMap操作符

当源Observable发射一个新的数据项时,如果旧数据项订阅还未完成,就取消旧订阅数据和停止监视那个数据项产生的Observable,开始监视新的数据项.

5、cast操作符

cast操作符将原始Observable发射的每一项数据都强制转换为一个指定的类型,然后再发射数据,它是map的一个特殊版本。相互转换的数据之间存在继承关系。

6、concat操作符

组合多个被观察者一起发送数据,合并后按发送顺序串行执行

7、merge操作符

组合多个被观察者一起发送数据,合并后按时间线并行执行

8、zip操作符

合并多个被观察者(Observable)发送的事件,生成一个新的事件序列(即组合过后的事件序列),并最终发送

9、reduce操作符

把被观察者要发送的事件聚合成一个事件发送。

10、collect操作符

将被观察者Observable发送的数据事件收集到一个数据结构里

11、startWith操作符

在一个被观察者发送事件前,追加发送一些数据或是一个新的被观察者

12、compose操作符

lift() 是针对事件项和事件序列的,而 compose() 是针对 Observable 自身进行变换。

Observable
    .create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
            emitter.onNext("aaa");
            emitter.onNext("bbb");
            emitter.onNext("ccc");
            emitter.onComplete();
        }
    })
    .compose(new ObservableTransformer<String, String>() {
        @Override
        public ObservableSource<String> apply(Observable<String> upstream) {
            return upstream.takeLast(1);
        }
    })
    .subscribe(new Observer<String>() {
        @Override
        public void onSubscribe(Disposable d) {
        }
        @Override
        public void onNext(String s) {
            Log.e("===========", "====>" + s);
        }

        @Override
        public void onError(Throwable e) {
            Log.e("===========", "====>" + e.toString());
        }

        @Override
        public void onComplete() {

        }
    });

compose将上游的Observable对象传递到apply()方法中,在apply()方法中添加变换,并返回当前Observable对象。

13、lift操作符

在 Observable 执行了lift(Operator) 方法之后,会创建一个ObservableLift对象并返回。在ObservableLift代理对象中将订阅ObservableLift的observer传递到operator的apply方法中,贴上源码:

@Override
    public void subscribeActual(Observer<? super R> observer) {
        Observer<? super T>  liftedObserver = ObjectHelper.requireNonNull(operator.apply(observer), "Operator " + operator + " returned a null Observer");
        source.subscribe(liftedObserver);
    }

然后,将apply()方法返回的Observer对象订阅初始Observable对象。

Observable
    .create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
            emitter.onNext("1");
            emitter.onNext("2");
            emitter.onNext("3");
            emitter.onComplete();
        }
    })
    .lift(new ObservableOperator<Integer, String>() {
        @Override
        public Observer<? super String> apply(Observer<? super Integer> observer) throws Exception {
            return new Observer<String>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(String s) { Log.e("============","===apply==>"+s); observer.onNext(Integer.parseInt(s));
                }

                @Override
                public void onError(Throwable e) { Log.e("============","===apply==>onError");
                    observer.onError(e);
                }

                @Override
                public void onComplete() { Log.e("============","===apply==>onComplete");
                    observer.onComplete();
                }
            };
        }
    })
    .subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

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

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

        @Override
        public void onComplete() {
            Log.e("============","===integer==>onComplete");
        }
    });

=apply>1
=integer>1
=apply>2
=integer>2
=apply>3
=integer>3
=apply>onComplete
=integer>onComplete

三、empty操作符

创建一个Observable对象并直接发送Complete事件,订阅完成。

Observable
    .empty()
    .subscribe(new Observer<Object>() {
        @Override
        public void onSubscribe(Disposable d) {
        }
        @Override
        public void onNext(Object o) {
            Log.e("=========", "===onNext==>" + o);
        }
        @Override
        public void onError(Throwable e) {
            Log.e("=========", "===onError==>" + e);
        }
        @Override
        public void onComplete() {
            Log.e("=========", "===onComplete==>");
        }
    });

打印结果:

 ===onComplete==>

四、error操作符

创建一个Observable对象并发送Error事件

Observable
    .error(new RuntimeException())
    .subscribe(new Observer<Object>() {
        @Override
        public void onSubscribe(Disposable d) {
        }
        @Override
        public void onNext(Object o) {
            Log.e("=========", "===onNext==>" + o);
        }
        @Override
        public void onError(Throwable e) {
            Log.e("=========", "===onError==>" + e);
        }
        @Override
        public void onComplete() {
            Log.e("=========", "===onComplete==>");
        }
    });

打印结果:

 ===onError==>java.lang.RuntimeException

五、never操作符

创建一个Observable对象但不发送任何事件

六、延时操作符

  • 定时操作:在经过了x秒后,需要自动执行y操作
  • 周期性操作:每隔x秒后,需要自动执行y操作
1、delay操作符

使被观察者延迟一段时间再发送事件

//参数一:延迟时间数,参数二:时间单位
delay(long delay, TimeUnit unit)
//错误延迟:即:若发生error事件则正常执行,执行完再执行error事件;若不设置,则发生error事件时会直接抛出error事件,不会执行延时事件
//参数一:延迟时间数,参数二:时间单位,参数三:错误延迟
delay(long delay, TimeUnit unit, boolean delayError)
//参数一:延迟时间数,参数二:时间单位,参数三:线程调度器,改变下游观察者的执行线程
delay(long delay, TimeUnit unit, Scheduler scheduler)
//参数一:延迟时间数,参数二:时间单位,参数三:线程调度器,参数四:错误延迟
delay(long delay, TimeUnit unit, Scheduler scheduler, boolean delayError)

2、timer操作符

  • 创建一个Observable对象
  • 延迟指定时间后发送一个0(Long型)给观察者
  • timer默认运行在子线程中,可指定运行线程
    long l=System.currentTimeMillis()/1000;
    Observable
        .timer(10,TimeUnit.SECONDS)
        //可以指定线程
        //timer(long delay, TimeUnit unit, Scheduler scheduler)
        .subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
            }
            @Override
            public void onNext(Long o) {
                Log.e("=========", "===onNext==>" + o);
                Log.e("=========", "===onNext==>" + (System.currentTimeMillis()/1000-l));
            }
            @Override
            public void onError(Throwable e) {
            }
            @Override
            public void onComplete() {
            }
    });

打印结果:

 ===onNext==>0
 ===onNext==>10

3、interval操作符

  • 创建一个Observable对象
  • 每隔指定时间发送一个事件,发送给观察者的参数有0不断递增,即每次加一
  • interval默认运行在子线程中,可指定运行线程
Observable
    .interval(3,TimeUnit.SECONDS)
    .subscribe(new Observer<Long>() {
        @Override
        public void onSubscribe(Disposable d) {
        }
        @Override
        public void onNext(Long o) {
            Log.e("=========", "===onNext==>" + o);
        }
        @Override
        public void onError(Throwable e) {
        }
        @Override
        public void onComplete() {
        }
    });

每隔3秒发送一条数据给观察者,数据为:0,1,2,3,…

4、range、rangeLong操作符

  • 快速创建一个Observable对象
  • 发送一个时间序列,指定开始值和发送数量
  • range与rangeLong的区别是:range发送的是Integer型,rangeLong发送的是Long型
range(final int start, final int count)
rangeLong(long start, long count)

defer操作符

七、过滤操作符

1. take,takeLast
 // 并不是取第n个,而是取前面n个数据
 take(n) 
 // 是在指定时间内取数据,如果超过了这个时间源Observable产生的数据将作废
 take(long time, TimeUnit unit)  
2. skip, skipFirst, skipLast
//跳过前面几项
skip(int count)
// 跳过前面的时间,之后产生的数据提交
skip(long time, TimeUnit unit)
// skipLast和skip相反,跳过后面的几项。
// 忽略最后时间单位内产生的数据
skipLast(long time,TimeUnit)  
3. first
  • first操作符,取发射的第一个数据,没有则发射默认值
4. last
  • last操作符和takeLast操作符相似,takeLast取发射的后几个数据,last取发射的最后一个数据,没有则发射默认值
  • 区别:takeLast没有默认值,last可以设置默认值
5. firstOrDefault, lastOrDefault

只发射最后一项(或者满足某个条件的最后一项)数据,可以指定默认值。

5、filter

过滤数据,不满足条件的数据将被过滤不发射。

    //自定义过滤条件
    filter(new Predicate<Integer>() {
        @Override
        public boolean test(Integer integer) throws Exception {
            return false;
        }
    })
6、ofType

过滤指定类型的数据

Observable.just(1,2,3,4,"a","b")
                .ofType(Integer.class)
                .subscribe(integer -> {
                    Log.e("===========", "===>" + integer);
                });

打印结果:

    ===>1
    ===>2
    ===>3
    ===>4

ofType过滤Integer以外的数据

7、elementAt/elementAtOrError操作符

发射某一项数据,如果超过了范围可以指定默认值。内部通过OperatorElementAt过滤。

区别:
elementAt:指定发射上游Observable传过来的第几项值,可以指定默认值,超过范围时发送默认值,若没指定默认值则不发送,直接调用onComplete()方法
elementAtOrError:指定发射上游Observable传过来的第几项值,超过范围时调用onError()方法,错误:java.util.NoSuchElementException
Observable.just(2, 4, 6, 8, 10)
//  .elementAtOrError(3)
    .elementAt(3)
    .subscribe(integer -> {
        Log.e("=========", "=====>" + integer);//8
    });
8、firstElement/lastElement操作符

发射上游Observable传过来的第一项值/最后一项值

Observable.just(2, 4, 6, 8, 10)
//      .firstElement()
        .lastElement()
        .subscribe(integer -> {
            Log.e("=========", "=====>" + integer);
        });
9、ignoreElements操作符

丢弃所有数据,只发射错误或正常终止的通知。内部通过OperatorIgnoreElements实现。

10、distinct/distinctUntilChanged操作符

distinct:过滤重复数据,内部通过OperatorDistinct实现。
distinctUntilChanged:过滤连续重复数据,内部通过OperatorDistinctUntilChanged实现

11、timeout操作符

如果原始Observable过了指定的一段时长没有发射任何数据,就发射一个异常(java.util.concurrent.TimeoutException)或者使用备用的Observable。

12、Debounce/throttleWithTimeout操作符

根据你指定的时间间隔进行限流
发送数据事件时,若2次发送事件的间隔<指定时间,就会丢弃前一次的数据,直到指定时间内都没有新数据发射时才会发送后一次的数据

//源码:
public final Observable<T> throttleWithTimeout(long timeout, TimeUnit unit) {
        return debounce(timeout, unit);
}
public final Observable<T> throttleWithTimeout(long timeout, TimeUnit unit, Scheduler scheduler) {
        return debounce(timeout, unit, scheduler);
}
public final Observable<T> debounce(long timeout, TimeUnit unit) {
        return debounce(timeout, unit, Schedulers.computation());
}
public final Observable<T> debounce(long timeout, TimeUnit unit, Scheduler scheduler) {
        ObjectHelper.requireNonNull(unit, "unit is null");
        ObjectHelper.requireNonNull(scheduler, "scheduler is null");
        return RxJavaPlugins.onAssembly(new ObservableDebounceTimed<T>(this, timeout, unit, scheduler));
}

八、条件操作符

1、single/singleOrError操作符

检测源Observable发送的数据项是否只有一个,否则报错:java.lang.IllegalArgumentException: Sequence contains more than one element!

public final Single<T> single(T defaultItem) {
        ObjectHelper.requireNonNull(defaultItem, "defaultItem is null");
    return RxJavaPlugins.onAssembly(new ObservableSingleSingle<T>(this, defaultItem));
}
public final Single<T> singleOrError() {
    return RxJavaPlugins.onAssembly(new ObservableSingleSingle<T>(this, null));
}

注:
single()方法可以设置一个默认值,当上游Observable发送的值为null时默认发送这个默认值。(但是,当上游发送null时报错:java.lang.NullPointerException: onNext called with null. Null values are generally not allowed in 2.x operators and sources.)

2、all操作符

all操作符接收一个函数参数,创建并返回一个单布尔值的Observable,如果原Observable正常终止并且每一项数据都满足条件,就返回true,如果原Observable的任何一项数据不满足条件或者非正常终止就返回false。

Observable
    .create((ObservableOnSubscribe<String>) emitter -> {
        emitter.onNext("aaa");
        emitter.onNext("bbb");
        emitter.onNext("ccc");
        emitter.onComplete();
    })
    .all(s -> {
        //自己判断上游Observable传递过来的数据是否满足条件,满足返回true,不满足返回false。返回false之后会终止数据发送。
        Log.e("=========", "====all=>" + s);
        return true;
    })
    .subscribe(new SingleObserver<Boolean>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onSuccess(Boolean aBoolean) {
            Log.e("=========", "====onSuccess=>" + aBoolean);
        }

        @Override
        public void onError(Throwable e) {
            Log.e("=========", "====onError=>" + e);
        }
    });
3、amb/ambArray操作符

amb操作符对于给定两个或多个Observables,它只发射首先发射数据或通知的那个Observable的所有数据。

Observable<String> observable1 = Observable
                .create((ObservableOnSubscribe<String>) emitter -> {
                    emitter.onNext("aaa");
                    emitter.onNext("bbb");
                    emitter.onNext("ccc");
                    emitter.onComplete();
                });
        Observable<String> observable2 = Observable
                .create((ObservableOnSubscribe<String>) emitter -> {
                    emitter.onNext("111");
                    emitter.onNext("222");
                    emitter.onNext("333");
                    emitter.onComplete();
                });
        List<ObservableSource<String>> observableSources = new ArrayList<>();
        observableSources.add(observable2);
        observableSources.add(observable1);
//        Observable.amb(observableSources)
        Observable.ambArray(observable1, observable2)
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(String t) {
                        Log.e("=============", "===onNext==>" + t);
                    }

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

                    @Override
                    public void onComplete() {
                        Log.e("=============", "===onComplete==>");
                    }
                });
4、contains操作符

contains操作符将接收一个特定的值作为一个参数,判定原Observable是否发射该值,若已发射,则创建并返回的Observable将发射true,否则发射false。

Observable
    .create((ObservableOnSubscribe<String>) emitter -> {
        emitter.onNext("aaa");
        emitter.onNext("1234");
        emitter.onNext("ccc");
        emitter.onComplete();
    })
    .contains("1234")
    .subscribe(new SingleObserver<Boolean>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onSuccess(Boolean aBoolean) {//true
            Log.e("===========", "====>" + aBoolean);
        }

        @Override
        public void onError(Throwable e) {

        }
    });
5、isEmpty操作符

isEmpty操作符用于判定原始Observable是否没有发射任何数据。若原Observable未发射任何数据,创建创建并返回一个发射true的Observable,否则返回一个发射false的Observable。

可以用来判断是否发射数据。

Observable
    .create((ObservableOnSubscribe<String>) emitter -> {
        emitter.onComplete();
    })
    .isEmpty()
    .subscribe(new SingleObserver<Boolean>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onSuccess(Boolean aBoolean) {
            //true
            Log.e("===========", "====>" + aBoolean);
        }

        @Override
        public void onError(Throwable e) {
            Log.e("===========", "====>" + e);
        }
    });
6、defaultIfEmpty操作符

defaultIfEmpty接收一个备用数据,在原Observable没有发射任何数据正常终止(以onComplete的形式)时,该操作符创建一个Observable并将备用数据发射出去。

内部调用的是switchIfEmpty

Observable
    .create((ObservableOnSubscribe<String>) emitter -> {
        emitter.onComplete();
    })
    .defaultIfEmpty("默认/备用")
    .subscribe(new Observer<String>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(String ss) {//默认/备用
            Log.e("===========", "==onNext==>" + ss);
        }

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

        @Override
        public void onComplete() {
            Log.e("===========", "==onComplete==>");
        }
    });
7、switchIfEmpty操作符

switchIfEmpty内部添加一个备用Observable。如果原始Observable没有发射任何数据正常终止,就使用备用的Observable。

Observable
    .create((ObservableOnSubscribe<String>) emitter -> {
//                    emitter.onNext("hhh");
        emitter.onComplete();
    })
    .switchIfEmpty(observer -> {
        observer.onNext("默认值");
        observer.onComplete();
    })
    .subscribe(new Observer<String>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(String ss) {//默认值
            Log.e("===========", "==onNext==>" + ss);
        }

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

        @Override
        public void onComplete() {
            Log.e("===========", "==onComplete==>");
        }
    });
8、sequenceEqual操作符

sequenceEqual(Observable,Observable)接收两个Observable参数,内部默认比较两个Observable发送的数据是否相同(顺序不同也是不同)
sequenceEqual(Observable,Observable,Func2)接收两个Observable参数和一个函数参数,在函数参数中,可以自定义比较两个参数。

若其中一个Observable没有发送数据,则需要调用onComplete()下游观察者才会得到比较结果false,都没有发送是true.

Observable
    .sequenceEqual((ObservableSource<String>) observer -> {
        observer.onNext("aaa");
        observer.onNext("ccc");
        observer.onComplete();
    }, observer -> {
        observer.onNext("ccc");
        observer.onNext("aaa");
        observer.onComplete();
    }, (s, s2) -> {
        return s.equals(s2);
    })
    .subscribe(new SingleObserver<Boolean>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e("=========", "==onSubscribe==>");
        }

        @Override
        public void onSuccess(Boolean aBoolean) {
            Log.e("=========", "==onSuccess==>" + aBoolean);
        }

        @Override
        public void onError(Throwable e) {
            Log.e("=========", "==onError==>" + e);
        }
    });
9、skipUntil/skipWhile操作符

skipUntil操作符在观察者订阅原Observable时,该操作符将是忽略原Observable的发射的数据,直到第二个Observable发射了一项数据那一刻,它才开始发射原Observable发射的数据。
skipWhile操作符丢弃原Observable发射的数据,直到发射的数据不满足一个指定的条件,才开始发射原Observable发射的数据。(在观察者订阅原Observable时,skipWhile操作符将忽略原Observable的发射物,直到你指定的某个条件变为false时,它开始发射原Observable发射的数据。)

10、takeUntil/takeWhile操作符

takeUntil操作符与skipUntil操作符作用相反,当第二个Observable发射了一项数据或者终止时,丢弃原Observable发射的任何数据。takeUntil(Func1)接受一个函数参数,当满足条件时终止发射数据。
takeWhile操作符与skipWhile操作符作用相反。在观察者订阅原Observable时,takeWhile创建并返回原Observable的镜像Observable,暂命名为_observable,发射原Observable发射的数据。当你指定的某个条件变为false时,_observable发射onCompleted终止通知。

九、其它

1、retry操作符

重试,即当出现错误时,让被观察者(Observable)重新发射数据

i = 0;
Observable
    .create((ObservableOnSubscribe<String>) emitter -> {
        emitter.onNext("aaa");
        if (i == 0) {
            emitter.onError(new RuntimeException());
        } else {
            emitter.onComplete();
        }
        i++;
    })
    .retry()
    .subscribe(new Observer<String>() {
        @Override
        public void onSubscribe(Disposable d) {
        }
        @Override
        public void onNext(String s) {
            Log.e("=============", "==onNext==>" + s);
        }
        @Override
        public void onError(Throwable e) {
            Log.e("=============", "==onError==>" + e);
        }
        @Override
        public void onComplete() {
            Log.e("=============", "==onComplete==>");
        }
    });

==onNext==>aaa
==onNext==>aaa
==onComplete==>

2、retryUntil操作符

出现错误后,判断是否需要重新发送数据

i = 0;
Observable
    .create((ObservableOnSubscribe<String>) emitter -> {
        emitter.onNext("aaa");
        if (i == 0) {
            emitter.onError(new RuntimeException());
        } else {
            emitter.onComplete();
        }
        i++;
    })
    //返回true表示不需要重新发送,false需要重新发送
    .retryUntil(() -> true)
    .subscribe(new Observer<String>() {
        @Override
        public void onSubscribe(Disposable d) {
        }
        @Override
        public void onNext(String s) {
            Log.e("=============", "==onNext==>" + s);
        }
        @Override
        public void onError(Throwable e) {
            Log.e("=============", "==onError==>" + e);
        }
        @Override
        public void onComplete() {
            Log.e("=============", "==onComplete==>");
        }
    });
3、retryWhen操作符

遇到错误时,将发生的错误传递给一个新的被观察者(Observable),并决定是否需要重新订阅原始被观察者(Observable)及发送事件

4、repeat操作符

无条件地,重复发送被观察者事件

5、repeatUntil操作符

有条件地,判断是否需要重复发送被观察者事件

 Observable
        .create((ObservableOnSubscribe<String>) emitter -> {
            emitter.onNext("hhh");
            emitter.onComplete();
        })
        //返回true表示不需要重复发送,返回false表示需要重复发送
        .repeatUntil(() -> true)
        .subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(String s) {
                Log.e("=============", "==onNext==>"+s);
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {
                Log.e("=============", "==onComplete==>");
            }
        });
6、repeatWhen操作符

有条件地,重复发送被观察者事件

7、count 操作符

统计被观察者发送事件的数量

Rxjava3 全新详解及常用操作符 RxJava 是一个基于 Java 的响应式编程库,用于处理异步事件流和数据流。它是由 Netflix 开发并开源,现在广泛用于 Android 和 Java 后端开发。RxJava 提供了一种用于组合和处理异步数据的丰富工具集,它的核心思想是将数据流视为一系列事件,以响应事件的方式进行处理。RxJava 提供了丰富的操作符,用于处理和转换数据流。这些操作符可以帮助你执行各种操作,包括过滤、映射、合并、变换等,以便更好地处理异步数据流。 阅读详情

相关推荐

化学科学催化反应产率预测之Transformer建模SMILES(Datawhale AI 夏令营)

循环神经网络:由于所有的前文信息都蕴含在一个隐向量中,随着序列长度的增加,早期的上下文信息会逐渐被遗忘。卷积神经网络:受限的上下文窗口在建模长文本时存在天然不足。需要多层卷积操作才能处理长文本。在本篇文章中,我们学习了Transformer的基本架构及其在化学反应产率预测中的应用。通过利用Transformer的Encoder部分对SMILES进行建模,我们能够更有效地捕捉序列数据的特征,从而提高模型的预测性能。

不想宅的冷同学 1095

reactor之操作符

为了方便对Flux/Mono的数据操作,减少自定义subscriber的代码量,reactor提供了操作符的概念,操作符可以对Flux/Mono的数据进行转换、过滤、合并等操作。操作符的很多名称和概念和java8的Stream API是类似的,比如map、filter、flatMap、reduce等。为了减少学习操作符的成本,建议大家先学习java8的Stream API,然后再学习reactor的操作符。

技术专栏 2700

01-嵌入式入门-如何看原理图

最近由于找到的工作是偏于嵌入式方向,因此又重新开始学习已经丢弃两年的知识。新手学习知识感觉有一个通病:喜欢收集各种各样的视频、资料,网盘里收藏一大堆,但是却从没有打开看过,到头来还是个小白,只听说过几个概念,而实际却是不知所云,这就是所谓的"学习综合征"。而我也是其中的一员,最近痛定思痛,就准备根据一套资料沉下心学习下去,不再进入收集资料的大军。...

weixin_34010566的博客 4483

从简单例子理解RxJava

从简单例子理解RxJava 我们的目的是通过一个简单的例子,理解RxJava中“事件流”这个过程 这里需要大家在看本文时自己去对照源码配合着来看,源码并不复杂 先上例子 val myObserver = object : SingleObserver<String> { override fun onSubscribe(d: Disposable) {} override fun onSuccess(t: String) { Log.e("TAG", t)} override fun o

qq_45383789的博客 280

ESP32天线阵列实现Wi-Fi空间成像与无直视定位

Wi-Fi信道状态信息(CSI)是OFDM系统中表征多径传播特性的基础物理层参数,其复数值包含幅度与相位,可反映无线环境的空间特征。基于CSI的射频感知技术,通过提取子载波级信道响应,结合阵列信号处理,实现到达角(AoA)估计与深度映射,本质是将通信链路重构为空间域传感器。该技术无需专用雷达硬件,具备低成本、被动式、隐私友好等工程优势,在室内定位、行为识别、仓储导航等场景具有广泛落地价值。本文聚焦ESP32平台,详解多芯片相位同步、CSI零拷贝采集、嵌入式MUSIC算法及信道图谱轻量化部署等关键实现。

weixin_30632267的博客 236

初识colmap

COLMAP是一款开源的计算机视觉软件,主要用于从一系列二维图像中进行三维重建。它全称为“COLLISION-MAPping”,是一个高度集成的Structure-from-Motion (SfM) 和 Multi-View Stereo (MVS) 管道工具,由斯坦福大学开发和维护。COLMAP的主要功能包括特征检测与匹配、增量式SfM、多视图立体匹配以及优化。它能够从无序或有序的二维照片集合中恢复出三维场景的几何结构(点云)以及每张图像对应的相机姿态。

Hhsjehejj的博客 5549

project-reactor-常见问题汇总

reactor常见问题

ssehs的博客 1350

使用pyqt5实现可勾选的测试用例界面

使用pyqt5实现可勾选的测试用例界面

天赐好车的博客 629

RxJava(十)switchIfEmpty 操作符实现 Android 检查本地缓存逻辑判断

RxJava系列文章目录导读: 一、RxJava create操作符的用法和源码分析 二、RxJava map操作符用法详解 三、RxJava flatMap操作符用法详解 四、RxJava concatMap操作符用法详解 五、RxJava onErrorResumeNext操作符实现app与服务器间token机制 六、RxJava retryWhen操作符...

Chiclaim 1万+

【nnUNetv2进阶】三、nnUNetv2 自定义网络-发paper必会

对于很多朋友来说,找到nnunet的网络结构位置的代码可能比较困难,因为nnunet的网络结构从else:代码中没有网络结构的类名,那么使用的网络是哪个呢?打开预处理后的数据集中的nnUNetPlans.json文件,如下图,configurations里面有2d、3d_fullres等,这些表示nnunet的模型,下面的network_class_name指的就是训练使用的模型结构,一般都是PlainConvUNet。

AI爱好者的博客,分享计算机领域相关知识 8755

基于SAGE算法的宽带信道参数估计算法的MATLAB仿真

本文将介绍如何使用MATLAB进行SAGE算法的仿真,以便更好地理解和应用该算法。SAGE算法是一种基于最大期望(Expectation-Maximization)方法的迭代估计算法,用于估计未知的参数。在宽带信道参数估计中,SAGE算法通过迭代优化来估计信道的传输函数。总结起来,本文介绍了如何使用MATLAB进行基于SAGE算法的宽带信道参数提取算法的仿真。通过以上步骤,我们可以得到估计的信道响应,并与真实信道响应进行比较。此外,SAGE算法还可以与其他信道估计算法相结合,以提高估计的准确性和性能。

CodeRoarX的博客 1075

RxJava(十)switchIfEmpty操作符实现Android检查本地缓存逻辑判断

switchIfEmpty(Observable emptyObservable)操作符从字面意思上就很好理解,就是当为空的时候跳转到emptyObservable。 那么如何理解当为空的时候. 下面将会使用实际案例解释这个switchIfEmpty的使用方法。 一、业务需求 假如我们的app里有加载文章列表功能,要求加载的逻辑如下:加载文章的的时候,先从本地加载,如果本地存在就是用本地的数据,...

android开发笔记 1805

【100%通过率】华为机试真题 Python 实现【对称美学】【2022.11 Q4 新题】

对称就是最大的美学,现有一道关于对称字符串的美学。 已知: 第1个字符串:R 第2个字符串:BR 第3个字符串:RBBR 第4个字符串:BRRBRBBR 第5个字符串:RBBRBRRBBRRBRBBR相信你已经发现规律了,没错! 就是第i个字符串=第i-1号字符串的取反+第i-1号字符串。取反即(R->B,B->R); 现在告诉你n和k,让你求得第n个字符串的第k个字符是多少。(k的编号从0开始)

MISAYAONE的博客 1万+

RxJava操作符

文章目录RxJava创建型操作符create()操作符just()操作符fromArray()操作符fromIterable()操作符differ()操作符timer()操作符interval()操作符intervalRange()操作符range()操作符rangeLong()操作符其他RxJava变换操作符map()操作符flatMap()操作符concatMap()操作符buffer()操作...

川峰的博客 5179

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深入浅出RxJava(二:操作符)

RxJava operator介绍,介绍了RxJava中几种常见的operator的用法

大头鬼Bruce 10万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

RxJava操作符汇总

RxJava操作符包含的操作符类型有如下几种: 1、创建操作符 :创建被观察者(Observable)对象&发送事件 转自:RxJava操作符汇总_zengke的博客-优快云博客_rxjava操作符 https://blog.youkuaiyun.com/zengke1993/article/details/80388510 ...

chuyouyinghe的专栏 6096

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

RxJava基础操作符和高级操作符

每个操作符(如 map, filter)内部通常会调用 lift(Operator) 方法,创建一个新的 Observable,这个新的 Observable 会包装上游的 Observable,并在订阅时,将下游的 Observer 包装成一个新的 Observer,从而在数据传递过程中插入转换或过滤逻辑。extends R>>): 将每个发射的项转换成一个新的 Observable,然后将这些 Observable 发射的数据“拍平”并合并到一个单一的 Observable 中。

csdn_silent的博客 1354

Rxjava操作符

目录一、RxJava操作符1、创建操作符 :创建被观察者(Observable)对象&发送事件1)Create() 操作符2)Just() 操作符3)fromIterable() 操作符4)timer()操作符5)fromArray() 操作符6)interval() 定时器7)intervalRange() 操作符8)Range() 操作符2、转换操作符:变换被观察者(Observabl...

qq_30172399的博客 2028

Rxjava3文档级教程二: 操作符全解

1 前言 1.1 用操作符组合Observable 对于ReactiveX来说,Observable和Observer仅仅是个开始,它们本身不过是标准观察者模式的一些轻量级扩展,目的是为了更好的处理事件序列。 ReactiveX真正强大的地方在于它的操作符,操作符让你可以变换、组合、操纵和处理Observable发射的数据。 Rx的操作符让你可以用声明式的风格组合异步操作序列,它拥有...

许进进的博客 1万+

Android RxJava使用介绍(三) RxJava的操作符

上一篇文章已经详细讲解了RxJava的创建型操作符,本片文章将继续讲解RxJava操作符,包括: Transforming Observables(Observable的转换操作符) Filtering Observables(Observable的过滤操作符)

呼啸而过的专栏 2万+

Android RxJava使用介绍(二) RxJava的操作符

上一篇文章我们通过一个简单的例子来给大家展示了RxJava的基本用法,相信大家已经对RxJava有了大概的了解,由于上篇文章对RxJava的使用介绍都是点到为止,并没有进行深入展开,也许你对RxJava有种名不副实的感觉。OK,下面我们就进入正题,一步步的揭开RxJava的神秘面纱!一个例子RxJava的强大之处,在于它提供了非常丰富且功能强悍的操作符,通过使用和组合这些操作符,你几乎能完成所有你想

呼啸而过的专栏 3万+

Android-Rxjava 常用操作符

Rxjava的优势 提高工作效率 能优雅的解决复杂的业务场景 1.Rxjava原理 RxJava 的原理就是创建一个 Observable 对象来干活,然后使用各种操作符建立起来的链式操作,就如同流水线一样,把你想要处理的数据一步一步地加工成你想要的成品,然后发射给 Subscriber 处理。 2.使用Rxjava需要添加的依赖 implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'io.reactivex.

风的轨迹 4993

RXJava的操作符

在Rxjava当中最重要的就是操作符,RxJava当中有着庞大的操作符 创建操作符:负责创建Observable对象 just( ) — 将一个或多个对象转换成发射这个或这些对象的一个Observablefrom( ) — 将一个Iterable, 一个Future, 或者一个数组转换成一个Observablerepeat( ) — 创建一个重复发射指定数据或数据序列的Observab

xiechengfa的技术笔记 3197

【从零学 RxJava】RxJava 3 —— 变换操作符、过滤操作符

【从零学 RxJava】RxJava 3 —— 变换操作符、过滤操作符前言版本mapdemoflatmapdemogroupBydemobufferdemowindowdemofirst & lastdemotakedemotakeLastdemoskipdemoskipLastdemoelementAtdemoignoreElementsdemodistinctdemodistinctUntilChangeddemofilterdemodebouncedemo总结github参考 前言 操作符是

小水牛的博客 1184

RxJava2 操作符总结

RxJava2 操作符总结Kotlin 协程 Flow 操作符总结

Android 1368

RxJava之转换操作符

在 RxJava- 操作符之过滤Observables 了解到,RxJava过滤操作符的基本使用,主要是针对Observable列表。本篇主要针对Observable列表中对象操作符的使用。用于变换可观测序列来创建一个能够更好的满足我们需求的序列。 map       map操作符通过指定一个的Func对象,将Observables转换为一个新的Observable对象并发射,观察者将收

行云间 5984
上一篇: RxJava源码分析(二):常用操作符
下一篇: Window flag
azhoufeng
博客等级 码龄10年 10粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值