四、RxJava过滤filter,take,distinct,elementAt,ofType

本文详细介绍了RxJava中的几个关键操作符:filter用于过滤数据,如在三鹿合生元飞鸽中只保留三鹿;take限制打印数量,如打印前8个元素;distinct去除重复项,例如打印不重复的整数;elementAt指定位置打印,如打印葵花宝典2;ofType用于类型过滤,如打印布尔值。

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

1.项目地址

在FilterActivity里面

2.讲解

1.filter

过滤,false的表示过滤掉,true的表示保留
在 这 “三鹿”, “合生元”, “飞鸽” 三个中,三鹿保留,其他两个都过滤掉,既只打印“三鹿”。

//上游
        Observable.just("三鹿", "合生元", "飞鸽")
                //订阅
                .filter(new Predicate<String>() {
                    @Override
                    public boolean test(String s) throws Throwable {//这里执行了三次,true表示打印,false表示不打印
                        Log.d(TAG, "test: 多少次");
//                return true;//不过滤,默认全部打印
                        if (s.equals("三鹿")) {
                            return true;
                        } else {
                            return false;
                        }
                    }
                })
                //订阅
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Throwable {
                        Log.d(TAG, "accept: " + s);
                    }
                });

2.take

可以限制打印多少个,下面的只打印8个(本来无限打印)

//定时器运行,只有在定时器运行的基础上,加入take过滤操作符,才有take过滤操作符的价值

        //上游
        Observable.interval(1, TimeUnit.SECONDS)//表示间隔一秒,打印一次。前面一个表示值,这里是1,后面表示单位,这里是秒
                .take(8)
                //下游
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Throwable {
                        Log.d(TAG, "accept: "+aLong);
                    }
                });

3.distinct

表示去重
本来打印全部,现在去掉重复的,然后打印

//上游
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Throwable {
                emitter.onNext(1);
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(1);
                emitter.onNext(3);
                emitter.onNext(5);
                emitter.onNext(4);
                emitter.onComplete();
            }
        })
        //中间操作
        .distinct()
        //下游
        .subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Throwable {
                Log.d(TAG, "accept: "+integer);
            }
        });

打印结果为:1,2,3,5,4

4.elementAt

指定位置打印。下面打印的是葵花宝典2。0表示打印第一个,2表示打印第三个

 //上游
        Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {
                emitter.onNext("九阴真经");
                emitter.onNext("葵花宝典");
                emitter.onNext("葵花宝典2");
                emitter.onNext("乾坤大罗伊");
                emitter.onNext("独孤九剑");
                emitter.onComplete();//完成标识
            }
        })
        //中间操作
        .elementAt(2,"默认典")//指定哪个保留
        //下游
        .subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Throwable {
                Log.d(TAG, "accept: "+s);
            }
        });
5.ofType
      Observable.just(false, 2, 3, true).ofType(Boolean.class).subscribe(new Action1<Integer>() {
            @Override
            public void call(Boolean b) {
                LogUtils.d("------>call():" + b);
            }
        });

打印的结果为:false,true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值