美文网首页
RxJava (源码待续)之过滤操作符

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

作者: yoosir | 来源:发表于2017-02-16 00:43 被阅读0次

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

    Filter

    • 作用分析

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

    Paste_Image.png
    • 代码示例

    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项数据

    Paste_Image.png
    • 示例代码

    //测是代码:
    /** * 只返回前面 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再发射,而不是依次发射一个。

    Paste_Image.png
    • 示例代码

    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项数据,只保留之前的数据

    Paste_Image.png
    • 示例代码

    /** * 跳过前面 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异常。

    Paste_Image.png
    • 示例代码

    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过滤掉重复的数据项

    Paste_Image.png
    • 示例代码

    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.
    

    参考文档

    RxJava官方文档

    结束语

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

    相关文章

      网友评论

          本文标题:RxJava (源码待续)之过滤操作符

          本文链接:https://www.haomeiwen.com/subject/saunuttx.html