本节介绍RxJava的两个过滤型操作符:filter操作符和distinct操作符。
filter操作符
filter操作符用于判断Observable弹射的每一个消息是否满足条件。如果满足条件,就继续向下游的观察者传递;如果不满足条件,就过滤掉。filter操作符的处理流程如图4-4所示。
图4-4 filter操作符的处理流程
filter操作符使用Func1函数式接口传入判断条件,其演示代码如下:
package com.crazymaker.demo.rxJava.basic;
...
@Slf4j
public class FilterOperatorDemo {
/**
*演示filter的基本使用
*/
@Test
public void filterDemo() {
//通过filter筛选能被5整除的数
Observable.range(1, 20)
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer % 5 == 0;
}
})
.subscribe(i -> log.info("filter int->" i));
}
}
上述演示代码首先通过rang操作符弹射一个范围为[1,20]的整数序列,然后通过filter操作符对弹射的数据进行筛选,筛选出能被5整除的数。
运行这个演示程序,输出的结果如下:
21:45:40.579 [main] INFO c.c.d.r.b.FilterOperatorDemo - filter int->5
21:45:40.584 [main] INFO c.c.d.r.b.FilterOperatorDemo - filter int->10
21:45:40.584 [main] INFO c.c.d.r.b.FilterOperatorDemo - filter int->15
21:45:40.585 [main] INFO c.c.d.r.b.FilterOperatorDemo - filter int->20
上面的演示代码,如果使用Lambda表达式进行改写,那么改写后的代码如下:
//使用Lambda形式演示filter的基本使用
@Test
public void filterDemoLambda() {
//通过filter筛选出能被5整除的数
Observable.range(1, 20)
.filter(integer -> integer%5==0)
.subscribe(i -> log.info("filter int->" i));
}
distinct操作符用于在消息流中过滤掉重复的元素,过滤规则为:
只允许还没有被弹射过的元素弹射出去。distinct操作符的处理流程如图4-5所示。
图4-5 distinct操作符的处理流程
下面是一个简单的distinct操作符的使用实例:
package com.crazymaker.demo.rxJava.basic;
//省略import
@Slf4j
public class FilterOperatorDemo {
/**
*演示distinct基本使用
*/
@Test
public void distinctDemo() {
Observable.just("apple", "pair", "banana", "apple", "pair")
.distinct() //使用distinct过滤重复元素
.subscribe(s -> log.info("distinct s->" s));
}
}
运行这个演示程序,输出的结果如下:
15:05:32.229 [main] INFO c.c.d.r.b.FilterOperatorDemo - distinct s->apple
15:05:32.234 [main] INFO c.c.d.r.b.FilterOperatorDemo - distinct s->pair
15:05:32.234 [main] INFO c.c.d.r.b.FilterOperatorDemo - distinct s->banana
从输出的结果可以看出,由于消息流前面已经被弹射过了,因此消息流后面的"apple"、"pair"两个元素被过滤了。
本文给大家讲解的内容是SpringCloudRPC远程调用核心原理: RxJava响应式编程框架,过滤型操作符- 下篇文章给大家讲解的是SpringCloudRPC远程调用核心原理: RxJava响应式编程框架,转换型操作符;
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持!