初识RxJava(五)过滤类 操作符

本文详细介绍了RxJava中的多种过滤操作符,包括filter、ofType、skip、distinct、take、throttleFirst等,通过具体代码示例展示了每个操作符的作用及效果,帮助读者深入理解并掌握RxJava数据流的过滤技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

前面已经记录了四种操作符,分别是 创建、延时、转换、组合 操作符,每天闲来无事看一篇。找个时间 写个demo 敲一下,然后就大体记住了,会用的第一步是记住 ,记住的第一步 是认识。下面开始 过滤 操作符的 笔记记录;

正文:

1、filter 操作符

1)、作用

从被观察者内过滤掉不符合需求条件的 内容,将符合条件的内容 发射给 观察者;

2)、代码
 /**
     * filter 操作符
     */
    private void filterMethod() {
        Observable.just(1, 2, 3, 4, 5, 6, 7).filter(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) throws Exception {
                return integer > 4;
            }
        }).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                logDUtils("onSubscribe");
            }

            @Override
            public void onNext(Integer integer) {
                logDUtils("onNext:" + integer);
            }

            @Override
            public void onError(Throwable e) {
                logDUtils("onError:" + e.getMessage());
            }

            @Override
            public void onComplete() {
                logDUtils("onComplete");
            }
        });
    }
3)、效果

效果

2、ofType 操作符

1)、作用

用于过滤被观察者 发送的数据 得到指定类型数据,将筛选后的数据 在 观察者那里进行接收;

2)、代码
 /**
     * ofType 操作符
     */
    private void ofTypeMethod() {
        Observable.just(1, "Android", "Java", 4, "航展")
                .ofType(String.class).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                logDUtils("onSubscribe");
            }

            @Override
            public void onNext(String s) {
                logDUtils("onNext:" + s);
            }

            @Override
            public void onError(Throwable e) {
                logDUtils("onError:" + e.getMessage());
            }

            @Override
            public void onComplete() {
                logDUtils("onComplete");
            }
        });
    }
3)、效果

效果

3、skip 操作符 和 skipLast 操作符

1)、作用

skip: 跳过发射事件 的前 n 个 数据;
skipLast :跳过发射事件 的后 n 个 数据。

2)、代码
  /**
     * skip 操作符 和 skipLast 操作符
     */
    @SuppressLint("CheckResult")
    private void skipMethod() {
        Observable.just(1, 2, 3, 4, 5, 6, 7, 8).skip(2).skipLast(3)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        logDUtils("accept:" +integer);
                    }
                });
    }
3)、效果

效果

4、distinct 操作符 和 distinctUntilChanged 操作符

1)、作用

distinct : 过滤重复的事件

distinctUntilChanged : 过滤连续重复事件

2)、代码
  /**
     * distinct 操作符 和  distinctUntilChanged 操作符
     */

    @SuppressLint("CheckResult")
    private void distinctMethod() {
        Observable.just(1, 22, 33, 44, 55, 33, 1, 22).distinct().subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                logDUtils("distinct--->accept:" + integer);
            }
        });

        Observable.just(1, 1, 2, 3, 4, 4, 5, 6, 6,5).distinctUntilChanged().subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                logDUtils("distinctUntilChanged--->accept:" + integer);
            }
        });
    }
3)、效果

效果

5、take 操作符 和 takeLast 操作符

1)、作用

take :只获取 被观察者 发送的数据的 前几位数据
takeLast :只获取 被观察 发送的数据 的后几位数据

2)、代码
  /**
     * take 操作符 和 takeLast 操作符
     */
    @SuppressLint("CheckResult")
    private void takeMethod() {
        Observable.just(1, 2, 3, 4, 5, 6, 7).take(3).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                logDUtils("take--->onSubscribe");
            }

            @Override
            public void onNext(Integer integer) {
                logDUtils("take--->onNext:" + integer);
            }

            @Override
            public void onError(Throwable e) {
                logDUtils("take--->onError:" + e.getMessage());
            }

            @Override
            public void onComplete() {
                logDUtils("take--->onComplete");
            }
        });


        Observable.just(1, 2, 3, 4, 5, 6, 78, 9).takeLast(4).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                logDUtils("takeLast--->onSubscribe");
            }

            @Override
            public void onNext(Integer integer) {
                logDUtils("takeLast--->onNext:" + integer);
            }

            @Override
            public void onError(Throwable e) {
                logDUtils("takeLast--->onError:" + e.getMessage());
            }

            @Override
            public void onComplete() {
                logDUtils("takeLast--->onComplete");
            }
        });
    }
3)、效果

效果

6、throttleFirst 操作符 和 throttleLast 操作符

1)、作用

throttleFirst :规定事件内 只发送 这段时间内的 第 1 次数据
throttleLast :规定事件内 只发送 这段时间内的 最后 1 次数据

2)、代码

    /**
     * throttleFirst 操作符 和 throttleLast 操作符
     */
    @SuppressLint("CheckResult")
    private void throttleFirstAndThrottleLastMethod() {
        Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                emitter.onNext("a");
                Thread.sleep(400);
                emitter.onNext("b");
                Thread.sleep(400);
                emitter.onNext("c");
                Thread.sleep(400);
                emitter.onNext("d");
                Thread.sleep(400);
                emitter.onNext("e");
                Thread.sleep(400);
                emitter.onNext("f");
            }
        }).throttleFirst(2, TimeUnit.SECONDS).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                logDUtils("throttleFirst--->accept:" + s);
            }
        });

        // interval 操作符: 从 0 开始 每隔 100 毫秒 产生一个递增的 long 类型数据
        Observable.interval(100, TimeUnit.MILLISECONDS)
                .throttleLast(1, TimeUnit.SECONDS)
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        logDUtils("throttleLast---->accept:" + aLong);
                    }
                });
    }
3)、效果

效果

7、Sample 操作符

作用

在某段时间内,只发送该段时间内最新即最后一次 1次事件 类似于 throttleLast 操作符

8、throttleWithTimeout 操作符 和 debounce 操作符

1)、作用

只发射给 观察者的 规定时间内 最后一个数据。

2)、代码
  /**
     * debounce 操作符 和 throttleWithTimeout 操作符
     */
    @SuppressLint("CheckResult")
    private void debounceAndThrottleWithTimeoutMethod() {
        //intervalRange : 开始数字为 1 数字数量为90 初始延迟1毫秒 数字间隔为100毫秒
        Observable.intervalRange(1,90,1,100, TimeUnit.MILLISECONDS)
                .debounce(101, TimeUnit.MILLISECONDS)
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        logDUtils("accept:" + aLong);
                    }
                });
    }

3)、效果

效果

8、elementAt 操作符

1)、作用

获取指定索引处的 数据

2)、代码
  /**
     * elementAt  操作符
     */
    @SuppressLint("CheckResult")
    private void elementAtMethod() {
        Observable.just(1, 2, 3, 4, 5, 6, 7).elementAt(4).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                logDUtils("accept:" + integer);
            }
        });
    }

#####3)、效果
效果

注意: 初始索引为 0

9、firstElement 操作符 和 lastElement 操作符

1)、作用

firstElement :获取首个 数据
lastElement :获取最后一个数据

2)、代码
  /**
     * firstElement 操作符 和 lastElement 操作符
     */
    @SuppressLint("CheckResult")
    private void firstElementAndLastElementMethod() {
        Observable.just("首个", "a", "b", "c").firstElement().subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                logDUtils("accept:" + s);
            }
        });
    }
3)、效果

效果

10、elementAtOrError操作符

作用

与 elementAt 操作符配合使用,当出现越界的情况 抛出异常。

欢迎关注

### 关于 UniApp 框架推荐资源与教程 #### 1. **Uniapp 官方文档** 官方文档是最权威的学习资料之一,涵盖了从基础概念到高级特性的全方位讲解。对于初学者来说,这是了解 UniApp 架构技术细节的最佳起点[^3]。 #### 2. **《Uniapp 从入门到精通:案例分析与最佳实践》** 该文章提供了系统的知识体系,帮助开发者掌握 Uniapp 的基础知识、实际应用以及开发过程中的最佳实践方法。它不仅适合新手快速上手,也能够为有经验的开发者提供深入的技术指导[^1]。 #### 3. **ThorUI-uniapp 开源项目教程** 这是一个专注于 UI 组件库设计实现的教学材料,基于 ThorUI 提供了一系列实用的功能模块。通过学习此开源项目的具体实现方式,可以更好地理解如何高效构建美观且一致的应用界面[^2]。 #### 4. **跨平台开发利器:UniApp 全面解析与实践指南** 这篇文章按照章节形式详细阐述了 UniApp 的各个方面,包括但不限于其工作原理、技术栈介绍、开发环境配置等内容,并附带丰富的实例演示来辅助说明理论知识点。 以下是几个重要的主题摘选: - **核心特性解析**:解释了跨端运行机制、底层架构组成及其主要功能特点。 - **开发实践指南**:给出了具体的页面编写样例代码,展示了不同设备间 API 调用的方法论。 - **性能优化建议**:针对启动时间缩短、图形绘制效率提升等方面提出了可行策略。 ```javascript // 示例代码片段展示条件编译语法 export default { methods: { showPlatform() { console.log(process.env.UNI_PLATFORM); // 输出当前平台名称 #ifdef APP-PLUS console.log('Running on App'); #endif #ifdef H5 console.log('Running on Web'); #endif } } } ``` #### 5. **其他补充资源** 除了上述提到的内容外,还有许多在线课程视频可供选择,比如 Bilibili 上的一些免费系列讲座;另外 GitHub GitCode 平台上也有不少优质的社区贡献作品值得借鉴研究。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值