SpringCloudRPC核心原理:RxJava响应式编程框架,过滤型操作符

过滤型操作符

本节介绍RxJava的两个过滤型操作符:filter操作符和distinct操作符。

SpringCloudRPC核心原理:RxJava响应式编程框架,过滤型操作符

 filter操作符

filter操作符用于判断Observable弹射的每一个消息是否满足条件。如果满足条件,就继续向下游的观察者传递;如果不满足条件,就过滤掉。filter操作符的处理流程如图4-4所示。

SpringCloudRPC核心原理:RxJava响应式编程框架,过滤型操作符

图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操作符用于在消息流中过滤掉重复的元素,过滤规则为:

只允许还没有被弹射过的元素弹射出去。distinct操作符的处理流程如图4-5所示。

SpringCloudRPC核心原理:RxJava响应式编程框架,过滤型操作符

图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"两个元素被过滤了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值