RxJava (源码待续)之过滤操作符

上一篇:RxJava 源码学习之变换操作符

Filter

  • 作用分析

Filter操作符使用你指定的一个谓词函数测试数据项,只有通过测试的数据才会被发射。

RxJava (源码待续)之过滤操作符_第1张图片
Paste_Image.png
  • 代码示例

Observable.just(1, 2, 3, 4, 5)
        .filter(new Func1() {
            @Override
            public Boolean call(Integer item) {
                return( item < 4 );
            }
        }).subscribe(new Subscriber() {
            @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项数据

RxJava (源码待续)之过滤操作符_第2张图片
Paste_Image.png
  • 示例代码

//测是代码:
/** * 只返回前面 2个数据 */
Observable.just(1, 2, 3, 4, 5)
        .take(2)
        .subscribe(new Subscriber() {
          @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再发射,而不是依次发射一个。

RxJava (源码待续)之过滤操作符_第3张图片
Paste_Image.png
  • 示例代码

Observable.just(1, 2, 3, 4, 5)
        .takeLastBuffer(3)
        .subscribe(new Subscriber>() {
            @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 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项数据,只保留之前的数据

RxJava (源码待续)之过滤操作符_第4张图片
Paste_Image.png

  • 示例代码

/** * 跳过前面 2个数据 */
Observable.just(1, 2, 3, 4, 5)
        .skip(2)
        .subscribe(new Subscriber() {
            @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异常。

RxJava (源码待续)之过滤操作符_第5张图片
Paste_Image.png
  • 示例代码

Observable.just(1, 2, 3, 4, 5)
        .elementAt(2)
        .subscribe(new Subscriber() {
            @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过滤掉重复的数据项

RxJava (源码待续)之过滤操作符_第6张图片
Paste_Image.png
  • 示例代码

Integer[] nums = {1,1,2,3,1,5,2,3,7,4};
Observable.from(nums)
        .distinct()
        .subscribe(new Subscriber() {
            @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.

参考文档

RxJava官方文档

结束语

ok,RxJava之过滤操作符已经学习完啦,当然这里都是分析一些常用的,想了解更多的操作符就去看RxJava官方文档吧。
下一篇:RxJava 源码学习之组合操作符

你可能感兴趣的:(RxJava (源码待续)之过滤操作符)