Observable中的take和filter

本文介绍了在RxJava的Observable中,take和filter方法的使用和它们的执行顺序。通过实例展示了当take放在filter之前和之后,如何影响循环次数和条件判断。在错误的顺序下,filter会阻止take的预期效果,而在正确顺序下,filter能够根据条件过滤数据,take则限制了总执行次数。

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

observable 中的fliter 方法 传入一个Predicate对象  实现方法并返回一个boolean值。作用是 在interval 循环的时候 进行判断 如果返回结果为true  则执行onnNext 方法 否则继续循环;take方法需要传入一个int值作用是控制整个循环的次数。这是这两个方法的的作用。

项目中的需求  在一个循环判断的interval中加入一个次数限制。

一开始我直接吧take加载fliter之后 贴代码

Observable.interval(0, 1, TimeUnit.SECONDS).filter(new Predicate<Long>() {
    @Override
    public boolean test(Long aLong) throws Exception {
        Log.d("MainActivity", "Observable--->filter-->"+aLong);
        return aLong > 20;
    }
}).take(10).observeOn(AndroidSchedulers.mainThread())
        .subscribeOn(Schedulers.io()).subscribe(new Observer<Long>() {
    @Override
    public void onSubscribe(Disposable d) {
        Log.d("MainActivity", "Observable--->onSubscribe");
    }

    @Override
    public void onNext(Long value) {
        Log.d("MainActivity", "Observable--->onNext--->" + value);
    }

    @Override
    public void onError(Throwable e) {
        Log.d("MainActivity", "Observable--->onError--->");
    }

    @Override
    public void onComplete() {
        Log.d("MainActivity", "Observable--->onComplete--->");
    }
});

贴log

07-18 14:55:47.559 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onSubscribe
07-18 14:55:47.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->0
07-18 14:55:48.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->1
07-18 14:55:49.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->2
07-18 14:55:50.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->3
07-18 14:55:51.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->4
07-18 14:55:52.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->5
07-18 14:55:53.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->6
07-18 14:55:54.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->7
07-18 14:55:55.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->8
07-18 14:55:56.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->9
07-18 14:55:57.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->10
07-18 14:55:58.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->11
07-18 14:55:59.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->12
07-18 14:56:00.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->13
07-18 14:56:01.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->14
07-18 14:56:02.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->15
07-18 14:56:03.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->16
07-18 14:56:04.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->17
07-18 14:56:05.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->18
07-18 14:56:06.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->19
07-18 14:56:07.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->20
07-18 14:56:08.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->21
07-18 14:56:08.565 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->21
07-18 14:56:09.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->22
07-18 14:56:09.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->22
07-18 14:56:10.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->23
07-18 14:56:10.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->23
07-18 14:56:11.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->24
07-18 14:56:11.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->24
07-18 14:56:12.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->25
07-18 14:56:12.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->25
07-18 14:56:13.563 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->26
07-18 14:56:13.564 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->26
07-18 14:56:14.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->27
07-18 14:56:14.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->27
07-18 14:56:15.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->28
07-18 14:56:15.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->28
07-18 14:56:16.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->29
07-18 14:56:16.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->29
07-18 14:56:17.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->30
07-18 14:56:17.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->30
    Observable--->onComplete--->

发现不是想要的结果。通过log分析fliter在返回false之后,后续的代码是不会执行的。 当返回结果为true之后,take才显示出效果来,进行了10次的次数限制。于是将take 放在fliter之前 代码就不贴了 

贴log

07-18 14:59:43.975 15447-15447/? D/MainActivity: Observable--->onSubscribe
07-18 14:59:43.978 15447-15486/? D/MainActivity: Observable--->filter-->0
07-18 14:59:44.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->1
07-18 14:59:45.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->2
07-18 14:59:46.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->3
07-18 14:59:47.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->4
07-18 14:59:48.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->5
07-18 14:59:49.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->6
07-18 14:59:50.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->7
07-18 14:59:51.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->8
07-18 14:59:52.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->9
07-18 14:59:52.980 15447-15447/test.lixing.com.daggerapplication D/MainActivity: Observable--->onComplete--->

判断进行了10次,没有返回true 所以就直接调用 onComplete 方法。

妥了 这才是需求的功能

特此立博,谨记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值