三、RxJava基础 ---过滤操作(Filtering Observables)

一、前言

上篇主要介绍了 转化操作,本篇介绍过滤操作

二、过滤操作 (Filtering Observables)

Operators that selectively emit items from a source Observable.

从Observable 的源头,有选择的发送。

1、filter

过滤数据。内部通过OnSubscribeFilter过滤数据。

    /**
     * filter 过滤数据。内部通过OnSubscribeFilter过滤数据。
     */
    private void filterTest(){
        Observable.just(1,2,3,4)
                .filter(new Func1<Integer, Boolean>() {
                    @Override
                    public Boolean call(Integer integer) {
                           if(integer>2){
                               return true; //  返回 ture 不拦截
                           } else {
                               return false; // 返回 false 拦截
                           }
                        //return integer >2; // 过滤数字大于2 的
                    }
                }).subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {
                Log.d("filter-->","onCompleted");
            }

            @Override
            public void onError(Throwable throwable) {
                Log.d("filter-->","onError:"+throwable.toString());
            }

            @Override
            public void onNext(Integer integer) {
                Log.d("filter-->","onNext"+integer.toString());
            }
        });

    }
2、distinct

过滤重复数据,内部通过OperatorDistinct实现。

/**
     * distinct :过滤重复数据,
     */
    private void distinctTest(){
        //基本数据类型
        Observable.just(1,2,3,2,3,4,2,1,2)
                .distinct()
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.d("---","debounce"+integer);// debounce1 debounce2 debounce3 debounce4
                    }
                });
        //引用数据类型
        Student yasuo = new Student("亚索",12,1022L);
        Student gailun = new Student("盖伦",18,1001L);
        Student timo = new Student("提莫",6,1009L);

        Observable.just(yasuo,yasuo,gailun,timo).distinct().subscribe(new Action1<Student>() {
            @Override
            public void call(Student student) {
                Log.d("student:","---->"+student.toString());
            }
        });
    }
3、ElementAt

发射某一项数据. 如果 超出Obserable 的长度, 则会报:
Caused by: java.lang.IndexOutOfBoundsException: 3 is out of bounds
使用 elementAtOrDefault 更安全点。

  /**
     * elementAt :过滤重复数据,
     */
    private void elementAtTest(){
        Observable.just(1,2,3,2,3,4,2,1,2)
                .elementAt(1)
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.d("call","-"+integer);// 2 
                    }
                });
        Observable.just(1,2,3)
                .elementAtOrDefault(3,0)//超出 Observable 长度 ,默认值 0  更安全点 
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.d("call","-"+integer); // 0
                    }
                });
    }
4、first / last

如果您只对Observable 的第一项感兴趣,或者符合某些标准条件项目的第一个,您可以通过第一个操作符过滤可观察到的项。

   /**
     * first :只对Observable 的第一项感兴趣,或者符合某些标准条件项目的第一个,
     */
    private void firstOrLastTest(){
        Observable.just(1,2,3)
                .first()// 第一个Observable 
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.d("first","---->"+integer); // 1
                    }
                });
        Observable.just(1,1,3,2,2,3)
                .first(new Func1<Integer, Boolean>() {
                    @Override
                    public Boolean call(Integer integer) {

                        return integer>2;// 符合 条件 第一个Observable 
                    }
                })
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.d("first","---->"+integer);// 3
                    }
                });
// lsat 用法 通过first
//        Observable.just(1,2,3)
//                .last() 
//                .subscribe(new Action1<Integer>() {
//                    @Override
//                    public void call(Integer integer) {
//                        Log.d("---","debounce -"+integer);// debounce -3
//                    }
//                });
    }
5、IgnoreElements

丢弃所有数据,只发射错误或正常终止的通知。内部通过OperatorIgnoreElements实现。

6、sample/throttleLast

定期发射Observable最近的数据。内部通过OperatorSampleWithTime实现。

  private void sampleTest() {
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(1);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                subscriber.onNext(2);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                subscriber.onNext(3);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                subscriber.onNext(4);
                subscriber.onNext(5);
                subscriber.onNext(6);
            }
        }).sample(999, TimeUnit.MILLISECONDS)
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.d("sample", "-" + integer.toString());// 2 3 6 
                    }
                });
    }
7、skip

跳过开始的N项数据或者一定时间内的数据。内部通过OperatorSkip和OperatorSkipTimed实现过滤。

   /**
     * skip : 跳过开始的N项数据或者一定时间内的数据。
     */
    private void skipTest(){
        Observable.just(1,2,3,4)
                .skip(2)//跳过 几个
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.d("skip","-->"+integer);// 3  4
                    }
                });
    }
8、take

只发射开始的N项数据或者一定时间内的数据。内部通过OperatorTake和OperatorTakeTimed过滤数据。

 Observable.just(3,4,5,6)
            .take(3)//发射前三个数据项
            .take(100, TimeUnit.MILLISECONDS)//发射100ms内的数据
9、takeLast

只发射最后的N项数据或者一定时间内的数据。内部通过OperatorTakeLast和OperatorTakeLastTimed过滤数据。takeLastBuffer和takeLast类似,不同点在于takeLastBuffer会收集成List后发射。

 Observable.just(3,4,5,6)
            .takeLast(3)
            .subscribe(integer -> Log.d("JG",integer.toString()));//4,5,6
### 回答1: 图像滤波和混合图像是数字图像处理中的两个重要概念。 图像滤波是指对图像进行各种运算,以达到去噪、平滑、增强等不同目的的技术。滤波可以通过卷积运算实现,将一个滤波器应用于图像的每个像素,得到一个处理后的图像。常见的图像滤波方法包括均值滤波、高斯滤波、中值滤波等。均值滤波可以去除图像中的高频噪声,使图像平滑;高斯滤波可以模糊图像,常用于降噪;中值滤波可以有效去除图像中的椒盐噪声。 混合图像是指通过将两个或多个图像进行适当的叠加而得到的一幅图像,可以实现视觉上的混合效果。常见的混合图像方法包括线性混合和拉普拉斯金字塔混合。线性混合通过对两幅图像的每个像素进行加权平均实现,加权系数可以根据需要控制不同图像的权重。拉普拉斯金字塔混合是一种多尺度混合技术,通过在不同尺度上对两幅图像进行混合,然后进行金字塔重建得到最终的混合图像,可以实现更加平滑的过渡效果。 图像滤波和混合图像在图像处理和计算机视觉应用中有着广泛的应用。滤波可以用于去除噪声、平滑图像、增强图像细节等;混合图像可以用于图像合成、特效处理、人脸融合等。通过合理选取滤波器和混合方法,可以达到目标图像处理和效果增强的目的。 ### 回答2: 图像滤波和混合图像是数字图像处理中的两个重要概念。 图像滤波是通过一系列滤波器对图像进行卷积运算,改变图像的特定特征或增强特定细节。滤波器可以用来模糊图像、锐化图像、增强边缘等。常用的滤波器包括均值滤波器、高斯滤波器、中值滤波器等。图像滤波在图像去噪、图像增强、特定特征提取等领域有广泛应用。 混合图像是通过将两个或多个图像进行特定的线性组合而生成的新图像。在混合图像中,一般有一个明显的图像作为主导图像,另一个图像则更隐蔽。混合图像中的主导图像对视觉上的高频信号(例如细节和边缘)敏感,而对低频信号(例如全局形状和颜色)不敏感。较隐蔽的图像则对低频信号敏感而对高频信号不敏感。通过调整两个图像的权重和相对大小,可以实现不同效果的混合图像,例如调整权重可以使主导图像更突出,或者使隐蔽图像更显眼。 图像滤波和混合图像是数字图像处理中常用的技术。滤波器可以在图像处理的不同阶段使用,例如预处理、特征提取、压缩等。混合图像则可以用于艺术创作、隐形信息传递等领域。通过合理运用这两种技术,可以改善图像质量、提取有用信息、实现艺术创作等目标。 ### 回答3: 图像滤波和混合图像技术是数字图像处理中常用的两种方法。 图像滤波是通过一系列数学运算改变图像的像素值,以实现去噪、平滑、增强图像细节等目的。滤波器可根据不同需求选择,如均值滤波器、高斯滤波器、中值滤波器等。例如,均值滤波器通过对每个像素周围区域进行平均,降低噪声,使图像更清晰。另外,高斯滤波器则更注重平滑处理,对图像进行模糊操作。 混合图像是一种通过将两个不同频率的图像进行叠加,从而产生一种仅在特定视距或角度下才能看清的效果。这种图像融合技术常用于安全标志、电影特效等领域。该技术利用了人眼对不同频率的光强变化敏感度不同的特性,将低频图像与高频图像相结合,以达到隐蔽通信或视觉效果的目的。 总结来说,图像滤波和混合图像技术是数字图像处理中常用的两种方法。图像滤波可以去除噪声、平滑图像、增强细节等。混合图像则是通过叠加不同频率的图像,产生一种特定视距或角度下才能看清的效果。这些技术在计算机视觉领域有广泛应用,例如图像处理、安全标志、电影特效等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值