RxJava 过滤操作符 first last single

时间:2021-09-18 17:49:25

first操作符是获取源Observable产生的第一个数据或者满足指定条件的第一个数据,,和前面所说的elementAt(0)有差别:

例子1:获取绝对的第一个,与elementAt(0)一样:

   Observable.range(1,10).first().subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                LogUtils.d("------>call():" + integer);
            }
        });

结果:

03-01 13:32:05.730 2280-2280/com.rxandroid.test1 D/----->: ------>call():1


例子2:或取满足指定条件的第一个数据 相对的

 Observable.range(10,20).first(new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer integer) {
                return integer>15;
            }
        }).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                LogUtils.d("------>call():" + integer);
            }
        });

结果:

03-01 13:32:05.730 2280-2280/com.rxandroid.test1 D/----->: ------>call():16


同理:last操作符 获取最后一个数据或者满足指定条件的最后一个数据:

 Observable.range(1, 10).last().subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                LogUtils.d("------>call():" + integer);
            }
        });

        Observable.range(10, 20).last(new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer integer) {
                return integer > 15;
            }
        }).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                LogUtils.d("------>call():" + integer);
            }
        });
结果:

03-01 13:37:37.930 13116-13116/com.rxandroid.test1 D/----->: ------>call():10
03-01 13:37:37.930 13116-13116/com.rxandroid.test1 D/----->: ------>call():29


single操作符:先看一个例子:

 Observable.range(1, 10).single().subscribe(new Observer<Integer>() {
            @Override
            public void onCompleted() {
                LogUtils.d("------>onCompleted()");
            }

            @Override
            public void onError(Throwable e) {
                LogUtils.d("------>onError()" + e);
            }

            @Override
            public void onNext(Integer integer) {
                LogUtils.d("------->onNext:" + integer);
            }
        });
log显示:

03-01 13:43:25.690 24155-24155/com.rxandroid.test1 D/----->: ------>onError()java.lang.IllegalArgumentException: Sequence contains too many elements


当产生一个数据项时:

Observable.just(1).single().subscribe(new Observer<Integer>() {
            @Override
            public void onCompleted() {
                LogUtils.d("------>onCompleted()");
            }

            @Override
            public void onError(Throwable e) {
                LogUtils.d("------>onError()" + e);
            }

            @Override
            public void onNext(Integer integer) {
                LogUtils.d("------->onNext:" + integer);
            }
        });

结果合理:

03-01 13:45:15.020 28348-28348/com.rxandroid.test1 D/----->: ------->onNext:1
03-01 13:45:15.020 28348-28348/com.rxandroid.test1 D/----->: ------>onCompleted()

默认的single是检测源Observable产生的数据项是否只有一个,否则报错了


例子3:检验满足条件的数据线是否只存在一个

判断数据大于9是否只包含一个数据项,满足条件输出这个,否则报错:

Observable.range(1,10).single(new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer integer) {
                return integer>9;
            }
        }).subscribe(new Observer<Integer>() {
            @Override
            public void onCompleted() {
                LogUtils.d("------>onCompleted()");
            }

            @Override
            public void onError(Throwable e) {
                LogUtils.d("------>onError()" + e);
            }

            @Override
            public void onNext(Integer integer) {
                LogUtils.d("------->onNext:" + integer);
            }
        });

结果为:

03-01 13:49:26.920 1858-1858/com.rxandroid.test1 D/----->: ------->onNext:10
03-01 13:49:26.920 1858-1858/com.rxandroid.test1 D/----->: ------>onCompleted()