上一篇:RxJava 源码学习之变换操作符
Filter
-
作用分析
Filter操作符使用你指定的一个谓词函数测试数据项,只有通过测试的数据才会被发射。
-
代码示例
Observable.just(1, 2, 3, 4, 5)
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer item) {
return( item < 4 );
}
}).subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) { System.out.println("Next: " + item);}
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); }});
//######################################################
输出结果:
Next: 1
Next: 2
Next: 3
Sequence complete.
Take
-
作用分析
Take只返回前面的N项数据,然后发射完成通知,忽略剩余的数据。
注意:TakeLast只发射最后的N项数据
-
示例代码
//测是代码:
/** * 只返回前面 2个数据 */
Observable.just(1, 2, 3, 4, 5)
.take(2)
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) { System.out.println("Next: " + item); }
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); }});
//####################################
输出结果:
Next: 1
Next: 2
Sequence complete.
TakeLastBuffer
-
作用分析
takeLastBuffer和TakeLast类似,,唯一的不同是它把所有的数据项收集到一个List再发射,而不是依次发射一个。
-
示例代码
Observable.just(1, 2, 3, 4, 5)
.takeLastBuffer(3)
.subscribe(new Subscriber<List<Integer>>() {
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); }
@Override
public void onNext(List<Integer> integers) {
System.out.print("onNext: ");
for (int i = 0; i < integers.size(); i++) {
System.out.print(integers.get(i));
if(i != integers.size() - 1){
System.out.print(",");
}
}
System.out.println();
}
});
//##################################
输出结果:
onNext: 3,4,5
Sequence complete.
Skip
-
作用分析
Skip 可以忽略Observable发射的前N项数据,只保留之后的数据。
注意:SkipLast忽略Observable发射的后N项数据,只保留之前的数据。
-
示例代码
/** * 跳过前面 2个数据 */
Observable.just(1, 2, 3, 4, 5)
.skip(2)
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) { System.out.println("Next: " + item); }
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); } });
//########################################
输出结果:
Next: 3
Next: 4
Next: 5
Sequence complete.
ElementAt
-
作用分析
ElementAt操作符获取原始Observable发射的数据序列指定索引位置的数据项,然后当做自己的唯一数据发射。
注意:elementAtOrDefault与elementAt的区别是,如果索引值大于数据项数,它会发射一个默认值(通过额外的参数指定),而不是抛出异常。但是如果你传递一个负数索引值,它仍然会抛出一个IndexOutOfBoundsException异常。
-
示例代码
Observable.just(1, 2, 3, 4, 5)
.elementAt(2)
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) { System.out.println("Next: " + item); }
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); } });
//##################################
输出结果:
Next: 3
Sequence complete.
Distinct
-
作用分析
Distinct过滤掉重复的数据项
-
示例代码
Integer[] nums = {1,1,2,3,1,5,2,3,7,4};
Observable.from(nums)
.distinct()
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) { System.out.println("Next: " + item); }
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); } });
//###########################################
输出结果:
Next: 1
Next: 2
Next: 3
Next: 5
Next: 7
Next: 4
Sequence complete.
参考文档
结束语
ok,RxJava之过滤操作符已经学习完啦,当然这里都是分析一些常用的,想了解更多的操作符就去看RxJava官方文档吧。
下一篇:RxJava 源码学习之组合操作符