博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(15)Reactor 3 Operators——响应式Spring的道法术器
阅读量:5861 次
发布时间:2019-06-19

本文共 3166 字,大约阅读时间需要 10 分钟。

本系列文章索引

前情提要 |

2.5 Reactor 3 Operators

虽然响应式流规范中对Operator(以下均称作”操作符“)并未做要求,但是与RxJava等响应式开发库一样,Reactor也提供了非常丰富的操作符。

2.5.1 丰富的操作符

本系列前边的文章中,陆续介绍了一些常用的操作符。但那也只是冰山之一角,Reactor 3提供了丰富的操作符,如果要一个一个介绍,那篇幅大了去了,授人以鱼不如授人以渔,我们可以通过以下几种途径了解操作符的应用场景,熟悉它们的使用方法:

  1. 是《Reactor 3 参考文档》中关于“如何选择合适的操作符”一节的翻译,介绍了如何选择合适的操作符。
  2. 参考中对Flux和Mono的解释和示意图。
  3. 如果想通过实战的方式上手试一下各种操作符,强烈推荐来自Reactor官方的项目。拿到项目后,你要做的就是使用操作符,完成“TODO”的代码,让所有的@Test绿灯就OK了。相信完成这些测试之后,对于常见的操作符就能了然于胸了。
  4. 此外,在日常的开发过程中,通过IDE也可以随时查阅,比如IntelliJ:

title

由于Project Reactor的核心开发团队也有来自RxJava的大牛,并且Reactor本身在开发过程中也借鉴了大多数RxJava的操作符命名(对于RxJava中少量命名不够清晰的操作符进行了优化),因此对于熟悉RxJava的朋友来说,使用Reactor基本没有学习成本。同样的,学习了Reactor之后,再去使用RxJava也没有问题。

2.5.2 “打包”操作符

我们在开发过程中,为了保持代码的简洁,通常会将经常使用的一系列操作封装到方法中,以备调用。

Reactor也提供了类似的对操作符的“打包”方法。

1)使用 transform 操作符

transform可以将一段操作链打包为一个函数式。这个函数式能在组装期将被封装的操作符还原并接入到调用transform的位置。这样做和直接将被封装的操作符加入到链上的效果是一样的。示例如下:

@Test    public void testTransform() {        Function
, Flux
> filterAndMap = f -> f.filter(color -> !color.equals("orange")) .map(String::toUpperCase); Flux.fromIterable(Arrays.asList("blue", "green", "orange", "purple")) .doOnNext(System.out::println) .transform(filterAndMap) .subscribe(d -> System.out.println("Subscriber to Transformed MapAndFilter: "+d)); }

这个例子,通过名为filterAndMap的函数式将filtermap操作符进行了打包,然后交给transform拼装到操作链中。输出如下:

blueSubscriber to Transformed MapAndFilter: BLUEgreenSubscriber to Transformed MapAndFilter: GREENorangepurpleSubscriber to Transformed MapAndFilter: PURPLE

2)使用 compose 操作符

compose 操作符与 transform 类似,也能够将几个操作符封装到一个函数式中。主要的区别就是,这个函数式是针对每一个订阅者起作用的。这意味着它对每一个 subscription 可以生成不同的操作链。举个例子:

public void testCompose() {        AtomicInteger ai = new AtomicInteger();        Function
, Flux
> filterAndMap = f -> { if (ai.incrementAndGet() == 1) { return f.filter(color -> !color.equals("orange")) .map(String::toUpperCase); } return f.filter(color -> !color.equals("purple")) .map(String::toUpperCase); }; Flux
composedFlux = Flux.fromIterable(Arrays.asList("blue", "green", "orange", "purple")) .doOnNext(System.out::println) .compose(filterAndMap); composedFlux.subscribe(d -> System.out.println("Subscriber 1 to Composed MapAndFilter :" + d)); composedFlux.subscribe(d -> System.out.println("Subscriber 2 to Composed MapAndFilter: " + d)); }

这个例子中,filterAndMap函数式有一个名为ai的会自增的状态值。每次调用subscribe方法进行订阅的时候,compose会导致ai自增,从而两次订阅的操作链是不同的。输出如下:

blueSubscriber 1 to Composed MapAndFilter :BLUEgreenSubscriber 1 to Composed MapAndFilter :GREENorangepurpleSubscriber 1 to Composed MapAndFilter :PURPLEblueSubscriber 2 to Composed MapAndFilter: BLUEgreenSubscriber 2 to Composed MapAndFilter: GREENorangeSubscriber 2 to Composed MapAndFilter: ORANGEpurple

也就是说,compose中打包的函数式可以是有状态的(stateful):

title

transform打包的函数式是无状态的。将compose换成transform再次执行,发现两次订阅的操作链是一样的,都会过滤掉orange

title

转载于:https://blog.51cto.com/liukang/2094071

你可能感兴趣的文章
机房日常技术总结——Windows篇
查看>>
关于PostgreSQL的GiST索引之一
查看>>
JAVA基础知识(三)
查看>>
如何快速构建高可用集群(Keepalived+Haproxy+Nginx)
查看>>
How to:使用EFS对远程文件服务器上的文件加密
查看>>
Microsoft BitLocker Administration and Monitoring安装
查看>>
前端学习 -- Css -- overflow
查看>>
Zabbix mpm 监控MySQL小计
查看>>
FLUSH TABLES WITH READ LOCK
查看>>
Python的内置函数实例(3)及其他
查看>>
文件共享之FAT PK NTFS
查看>>
Oracle 11G RAC 安装图示(三)
查看>>
数据结构基础(3) --Permutation & 插入排序
查看>>
Android官方技术文档翻译——清单合并
查看>>
oracle记录各登陆主机用户名,登陆ip,所执行的命令
查看>>
Gradle 1.12用户指南翻译——第三十一章. FindBugs 插件
查看>>
转载:Python十分钟入门
查看>>
Connection broken for id 62, my id = 70, error =
查看>>
CLR内存的概念
查看>>
NA-NP-IE系列实验20: EIGRP 负载均衡
查看>>