iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >(15)Reactor 3 Operat
  • 388
分享到

(15)Reactor 3 Operat

ReactorOperat 2023-01-31 06:01:26 388人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

本系列文章索引《响应式spring的道法术器》前情提要 Reactor 3快速上手 | 响应式流规范 2.5 Reactor 3 Operators 虽然响应式流规范中对Operator(以下均称作”操作符“)并未做要求,但是与RxJa

本系列文章索引《响应式spring的道法术器》
前情提要 Reactor 3快速上手 | 响应式流规范

2.5 Reactor 3 Operators

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

2.5.1 丰富的操作符

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

  1. 附2是《Reactor 3 参考文档》中关于“如何选择合适的操作符”一节的翻译,介绍了如何选择合适的操作符。
  2. 参考Javadoc中对Flux和Mono的解释和示意图。
  3. 如果想通过实战的方式上手试一下各种操作符,强烈推荐来自Reactor官方的lite-rx-api-hands-on项目。拿到项目后,你要做的就是使用操作符,完成“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<String>, Flux<String>> 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拼装到操作链中。输出如下:

blue
Subscriber to Transformed MapAndFilter: BLUE
green
Subscriber to Transformed MapAndFilter: GREEN
orange
purple
Subscriber to Transformed MapAndFilter: PURPLE

2)使用 compose 操作符

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

    public void testCompose() {
        AtomicInteger ai = new AtomicInteger();
        Function<Flux<String>, Flux<String>> 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<String> 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自增,从而两次订阅的操作链是不同的。输出如下:

blue
Subscriber 1 to Composed MapAndFilter :BLUE
green
Subscriber 1 to Composed MapAndFilter :GREEN
orange
purple
Subscriber 1 to Composed MapAndFilter :PURPLE
blue
Subscriber 2 to Composed MapAndFilter: BLUE
green
Subscriber 2 to Composed MapAndFilter: GREEN
orange
Subscriber 2 to Composed MapAndFilter: ORANGE
purple

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

title

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

title

--结束END--

本文标题: (15)Reactor 3 Operat

本文链接: https://www.lsjlt.com/news/190609.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • (15)Reactor 3 Operat
    本系列文章索引《响应式Spring的道法术器》前情提要 Reactor 3快速上手 | 响应式流规范 2.5 Reactor 3 Operators 虽然响应式流规范中对Operator(以下均称作”操作符“)并未做要求,但是与RxJa...
    99+
    2023-01-31
    Reactor Operat
  • 15、OSPF学习心得3
    1、DR和BDR的选举双方同时进入2-Way状态开始选举,选举时间=死亡时间(40S)(1) 首先检查DR和BDR字段是否为空,如果都为空(0.0.0.0)表明没有DR也没有BDR。(2) 先选举出BDR(DR、BDR都为空)① 先比较优先...
    99+
    2023-01-31
    学习心得 OSPF
  • 2018-3-15 Linux学习笔记
    编辑虚拟主机配置文件vim /usr/local/nginx/conf/vhost/test.com.conf 配置如下:location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|...
    99+
    2023-01-31
    学习笔记 Linux
  • “3·15”想起媒体的服务
    今天是“3·15”,全社会都在大谈服务。正好新闻正在报道路透社记者遭遇“中国博客门”事件,让我想起了媒体的服务。 媒体是什么?是为大众或特定人群提供信息服务的机构,也就是说,媒体“生产”和“出售”的是信息,这与汽车企业生产和销...
    99+
    2023-01-31
    媒体
  • 第15课 python 项目实操3
    到了今日,你已经基本懂得 python 是什么了,装逼要专业的,就class ,def 定义类,定义函数去封装 一下要做的内容;,然后需要调用的时候,进行调用,这时候 代码又条例,看起来方便易懂,也是在日后编码的时候需要注意的,要习惯用类,...
    99+
    2023-01-31
    项目 python
  • Linux Mint 15路线图里的3大新特性分别是什么
    本篇文章给大家分享的是有关Linux Mint 15路线图里的3大新特性分别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Linux Mint 14 (Nadia)的发布...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作