当前位置: 首页 > news >正文

Reactor操作符的共享与复用

在 Reactor 中,transformtransformDeferred 是两个用于代码复用和操作符链封装的高级操作符。它们允许你将一组操作符封装成一个函数,并在适当的时候应用到响应式流中。以下是它们的详细总结:


1. transform 操作符

  • 作用transform 操作符允许你将操作符链的一部分封装成一个函数,并在实例化时(assembly time)应用到原始操作符链上。这意味着所有订阅者都会应用相同的操作符链。
  • 适用场景:适用于所有订阅者共享相同行为的场景,例如统一的日志记录、转换等。
  • 示例
      // 定义一个函数,用于过滤掉"orange"颜色并将其余颜色转换为大写Function<Flux<String>, Flux<String>> filterAndMap =f -> f.filter(color -> !color.equals("orange")).map(String::toUpperCase);// 从列表创建Flux,并在过滤和映射前打印每个元素Flux.fromIterable(Arrays.asList("blue", "green", "orange", "purple")).doOnNext(System.out::println)// 使用之前定义的函数对Flux进行转换.transform(filterAndMap)// 订阅转换后的Flux,并打印每个元素.subscribe(d -> System.out.println("Subscriber to Transformed MapAndFilter: " + d));
    
    执行结果如下
    blue
    Subscriber to Transformed MapAndFilter: BLUE
    green
    Subscriber to Transformed MapAndFilter: GREEN
    orange
    purple
    Subscriber to Transformed MapAndFilter: PURPLE
    

2. transformDeferred 操作符

  • 作用transformDeferred 操作符与 transform 类似,也允许你将操作符链封装成一个函数,但主要的区别在于函数的执行时机transformDeferred 是在订阅发生时(subscription time)才应用函数的。这意味着它可以为每个订阅者生成不同的操作链,甚至可以维护一些状态(例如计数器、随机数等)。
  • 适用场景:适用于每个订阅者需要不同操作链的场景,例如根据订阅者的身份、时间、状态等动态生成不同的操作链。
  • 示例
      // 使用AtomicInteger来实现线程安全的计数器AtomicInteger ai = new AtomicInteger();// 定义一个函数,根据计数器的值来选择不同的处理逻辑Function<Flux<String>, Flux<String>> filterAndMap = f -> {// 如果计数器的值为1,则过滤掉"orange"颜色,否则过滤掉"purple"颜色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,从颜色列表开始,通过.doOnNext()打印每个元素,然后通过.transformDeferred()应用filterAndMap函数Flux<String> composedFlux =Flux.fromIterable(Arrays.asList("blue", "green", "orange", "purple")).doOnNext(System.out::println).transformDeferred(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));
    
    执行结果如下
    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
    

3. transformtransformDeferred 的区别

操作符执行时机是否为每个订阅者生成不同操作链是否可以维护状态
transform实例化时
transformDeferred订阅时

4. 总结

  • transform:适用于所有订阅者共享相同操作链的场景,例如统一的日志记录、转换等。
  • transformDeferred:适用于每个订阅者需要不同操作链的场景,例如根据订阅者的身份、时间、状态等动态生成不同的操作链。

通过使用 transformtransformDeferred,你可以更灵活地测试响应式流,尤其是当你需要模拟复杂或非标准的数据流时,它们是非常有用的工具。

http://www.lryc.cn/news/578066.html

相关文章:

  • Excel数据匹配合并工具
  • Linux 系统管理:自动化运维与容器化部署
  • 2025年数字信号、计算机通信与软件工程国际会议(DSCCSE 2025)
  • postman接口测试全部流程
  • Git 简介安装教程
  • [附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的校园服务平台管理系统,推荐!
  • Fiddler中文版抓包工具如何帮助前端开发者高效调试
  • 我的第一个开源项目:用Python搭建轻量级静态网页服务器—— 零基础也能实现的Web开发初体验
  • 鸿蒙应用开发:ArkTS中接口的声明和使用
  • SQL优化(插入、主键、order by、group by)
  • 关于 java:8. Java 内存模型与 JVM 基础
  • ClickHouse 部署
  • RK3568平台开发系列讲解:WIFI的调试手段
  • 重构老项目不再“踩雷”:飞算JavaAI的本地化智能合并实战
  • 企业自建云概念解读|私有云、专有云、混合云、分布式云、企业云
  • Windows桌面上的「了解此图片」怎么弄掉?
  • Tailwind CSS 配置正确,也没有报错,但是样式没有生效(解决~)
  • 如何用废弃电脑变成服务器搭建web网站(公网访问零成本)
  • 成像光谱遥感技术中的AI革命:ChatGPT在遥感领域中的应用
  • 【MySQL基础】MySQL索引全面解析:从原理到实践
  • vscode ssh远程连接ubuntu20失败的解决方法
  • 第9篇:Gin配置管理-Viper的实战使用
  • 批量生成文件名6
  • LeetCode Hot100 (二叉树)
  • 大模型-分布式推理简介
  • Deepoc 大模型在无人机行业应用效果的方法
  • c# 详细分析Task.sleep和Thread.sleep 的区别、使用场景和应用示例
  • MySQL中查询JSON数组字段包含特定字符串的方法
  • 通过python+openCV实现对图片中箭头方向的判断
  • MAC电脑,在 Docker 中已经运行过一次 Oracle 镜像后,再次运行具体操作。