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.pswp.cn/bicheng/87042.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#中的Converter详解

Converter是C#中一个非常有用的概念&#xff0c;主要用于类型转换。它通常以委托或接口的形式出现&#xff0c;允许开发者定义如何将一种类型转换为另一种类型。下面我将详细介绍Converter的概念、使用场景&#xff0c;并以布尔型转换为例展示具体应用。 Converter的基本概念 …

LabVIEW荧光微管图像模拟

利用LabVIEW平台&#xff0c;集成 PI 压电平台、Nikon 荧光显微镜及Andor sCMOS 相机等硬件&#xff0c;构建荧光微管滑行实验图像序列模拟系统。通过程序化模拟微管运动轨迹、荧光标记分布及显微成像过程&#xff0c;为生物医学领域微管跟踪算法测试、运动特性分析提供标准化仿…

CentOS下Nginx服务器搭建全攻略

Nginx 安装与配置完整指南 一、安装 Nginx 1.1 添加 Nginx 官方仓库 在 CentOS 系统中&#xff0c;默认仓库的 Nginx 版本可能较旧&#xff08;通常为 1.12 或更早版本&#xff09;&#xff0c;建议添加官方仓库来安装最新稳定版本&#xff08;目前为 1.25.x&#xff09;&am…

网络拓扑图绘制全流程:从架构解析到工具实战

在数据呈现与系统管理中&#xff0c;清晰展示设备间的逻辑关系至关重要。网络拓扑图正是这样一种有效的可视化工具。它通过节点设备和连接线路&#xff0c;直观呈现网络结构或项目流程中各元素的布局与交互关系&#xff0c;帮助理解系统运作、诊断问题并确保项目顺利进行。 1. …

Git 简介安装教程

&#x1f4e2;欢迎点赞&#x1f44d;收藏⭐留言&#x1f4dd;如有错误敬请指正&#xff01; 目录 一、Git 的安装1.1 Git 的下载1.2 Git 的安装1.2.1 使用许可声明1.2.2 选择安装目录1.2.3 选择安装组件1.2.4 选择开始菜单文件夹1.2.5 选择 Git 默认编辑器1.2.6 决定初始化新项…

鸿蒙NEXT-鸿蒙三层架构搭建,嵌入HMRouter,实现便捷跳转,新手攻略。(2/3)

在上一小节我们已经完成了关于三层架构的搭建&#xff0c;接下来我们来实现在三层架构中的导入依赖&#xff0c;将他们相互联系起来。 第一步&#xff1a;在features产品定制层中&#xff0c;对其中所有的动态共享包导入依赖&#xff0c;示例features>my>oh-package.jso…

【每天一个知识点】语料投毒(Corpus Poisoning)

“语料投毒”&#xff08;Corpus Poisoning&#xff09; 是指攻击者通过向大型语言模型&#xff08;如 ChatGPT&#xff09;使用的外部知识库中注入恶意或误导性文档&#xff0c;从而干扰模型的检索与回答过程&#xff0c;导致其输出错误、虚假或有害内容。 &#x1f50d; 举个…

疏通经脉: Bridge 联通逻辑层和渲染层

本节概述 经过前面两节的开发&#xff0c;我们已经完成了小程序逻辑线程和 UI 线程的启动引擎准备&#xff0c;这节开始&#xff0c;我们将完善 native bridge 层的搭建&#xff0c;构建起逻辑线程和UI线程之间的桥梁。 开始之前我们先来回顾一下逻辑引擎小节相关的流程图: 一…

【攻防篇】解决:阿里云docker 容器中自动启动xmrig挖矿

解决&#xff1a;阿里云服务器docker容器被植入挖矿程序 **1. 紧急处理&#xff1a;停止挖矿进程****&#xff08;1&#xff09;查找并终止 xmrig 进程****&#xff08;2&#xff09;删除恶意文件** **2. 清理被感染的容器****&#xff08;1&#xff09;停止并删除容器****&…

对称非对称加密,https和http,https通讯原理,Charles抓包原理

文章目录 对称加密的非对称加密http和https原理TCP三次握手四次挥手https通讯流程&#xff1a;Charles抓包原理 对称加密的非对称加密 对称加密&#xff1a;发送方的接收方式使用同一个秘钥进行加密和解密&#xff0c;发送方将需要发送的数据&#xff0c;选择某种加密算法&…

Kubernetes(K8s)_15_调度原理

文章目录 Pod调度实现原理调度队列优先队列底层数据 调度缓存调度框架 Pod调度 Pod调度: 通过污点、容忍度和亲和性影响Pod的调度 调度器实现, 其基于配置器构造(其配置来源于配置API)调度过程中任何插件返回拒绝, 都会导致Pod可能再次返回调度队列 如: Pod调度简略流程 调度…

moduo之tcp客户端TcpClient

结构 #mermaid-svg-muvN6eOMXA4rCyXP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-muvN6eOMXA4rCyXP .error-icon{fill:#552222;}#mermaid-svg-muvN6eOMXA4rCyXP .error-text{fill:#552222;stroke:#552222;}#merm…

中国科技术语杂志中国科技术语杂志社中国科技术语编辑部2025年第3期目录

理论研究 认知术语学与社会认知术语学比较研究 吴小芳; 3-11 大语言模型背景下的术语翻译研究&#xff1a;现状、问题与展望 朱玉彬;王梓; 12-20 航空事件谣言叙事中的术语初探 刘成盼;刘东亮; 21-28 定名研讨 浅谈训诂、训诂学和训诂学术语 林童; 29-35 …

自然语言处理NLP期末复习

目录 第一章1. NLP的基本过程包括哪些-自然语言处理面临的困难是什么2. 自然语言处理算法定义&#xff0c;过程和应用3. 结合自己的研究-描述研究中涉及的自然语言处理模型或算法&#xff0c;模型或算法原理&#xff0c;具体的处理过程4. 自然语言处理的的两大核心任务是5. 程序…

单片机 - STM32F103“复用功能重映射”完整解析:从JTAG释放到TIM重映射实战详解

本文将详细讲解 STM32F103 系列中常见的“复用功能重映射”&#xff08;Remap&#xff09;机制&#xff0c;包括 JTAG 占用、引脚默认功能与复用功能的关系&#xff0c;以及如何通过寄存器或标准库代码实现重映射。以 TIM3 在 PB4/PB5 上输出 PWM 为例&#xff0c;进行实战讲解…

【C语言】知识总结·内存函数

目录 前言&#xff1a; 一、内存复制函数 1. memcpy - 内存块复制 2. memmove - 内存块移动 二、内存设置函数 1. memset - 内存块填充 三、内存比较函数 1. memcmp 2.memchr 三内存分配函数 1 .malloc 2.free 总结&#xff1a; 注意事项&#xff1a; 前言&…

python+uniapp基于微信小程序面向品牌会员的在线商城系统

文章目录 具体实现截图本项目支持的技术路线源码获取详细视频演示&#xff1a;文章底部获取博主联系方式&#xff01;&#xff01;&#xff01;&#xff01;本系统开发思路进度安排及各阶段主要任务java类核心代码部分展示主要参考文献&#xff1a;源码获取/详细视频演示 ##项目…

小鱼fish系统 sudo apt update报错(密钥失效)

在使用小鱼fish提供的系统镜像文件&#xff0c;sudo apt update系统更新时遇到了以下报错&#xff0c;即ROS 2 仓库的 GPG 密钥已过期&#xff0c;以及 Docker 仓库使用了过时的密钥存储方式 fishrosfishros-linux:~$ sudo apt update 获取:1 http://mirrors.tuna.tsinghua.ed…

深度优先搜索 (DFS) 详解

1. 什么是深度优先搜索&#xff1f; 深度优先搜索&#xff08;Depth-First Search, DFS&#xff09;是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都已被探寻过&#xff0c;搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进…

文心4.5开源大模型的使用和部署

前言 就在今天&#xff0c;文心4.5模型开源了&#xff0c;不是一个&#xff0c;而是整个系列模型正式开源。很突然&#xff0c;我都震惊了。文心4.5系列开源模型共10款&#xff0c;涵盖了激活参数规模分别为47B 和3B 的混合专家&#xff08;MoE&#xff09;模型&#xff08;最…