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()