反应堆中的地图与平面地图

2024-03-06

我找到了很多关于RxJava https://stackoverflow.com/questions/22847105/when-do-you-use-map-vs-flatmap-in-rxjava,但我想了解它在 Reactor 中是如何工作的。

我目前的理解非常模糊,我倾向于认为 map 是同步的,而 flatMap 是异步的,但我无法真正理解它。

这是一个例子:

files.flatMap { it ->
    Mono.just(Paths.get(UPLOAD_ROOT, it.filename()).toFile())
        .map {destFile ->
            destFile.createNewFile()
            destFile    
        }               
        .flatMap(it::transferTo)
}.then()  

我有文件(一个Flux<FilePart>)我想把它复制给一些UPLOAD_ROOT在服务器上。

这个例子取自一本书。

我可以改变所有.map to .flatMap反之亦然,一切仍然有效。我想知道有什么区别。


  • map用于同步、非阻塞、一对一转换
  • flatMap用于异步(非阻塞)1 到 N 转换

差异在方法签名中可见:

  • map需要一个Function<T, U>并返回一个Flux<U>
  • flatMap需要一个Function<T, Publisher<V>>并返回一个Flux<V>

这是主要的提示:你can pass a Function<T, Publisher<V>> to a map,但它不知道如何处理Publishers,这将导致Flux<Publisher<V>>,一系列惰性发布者。

另一方面,flatMap期望一个Publisher<V>对于每个T。它知道如何处理它:订阅它并在输出序列中传播它的元素。结果,返回类型为Flux<V>: flatMap将压平每个内部Publisher<V>进入输出序列all the Vs.

关于1-N方面:

对于每个<T>输入元素,flatMap将其映射到Publisher<V>。在某些情况下(例如 HTTP 请求),该发布者将仅发出一项,在这种情况下,我们非常接近异步map.

但这就是堕落的情况。一般情况是Publisher可以发出多个元素,并且flatMap同样有效。

举个例子,假设您有一个反应式数据库,并且您从一系列用户 ID 中进行平面映射,并发出一个返回用户集合的请求Badge。你最终会得到一个Flux<Badge>所有这些用户的所有徽章。

Is map真正同步并且非阻塞?

是的:它在运算符应用它的方式上是同步的(简单的方法调用,然后运算符发出结果),并且在函数本身不应该阻止调用它的运算符的意义上是非阻塞的。换句话说,它不应该引入延迟。那是因为一个Flux整体还是异步的。如果它阻塞了中间序列,它将影响其余的序列Flux处理,甚至其他Flux.

如果您的地图函数阻塞/引入延迟但无法转换为返回Publisher, 考虑publishOn/subscribeOn以抵消单独线程上的阻塞工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反应堆中的地图与平面地图 的相关文章

  • 如何找出导致 poi 损坏 xlsx / xlsm 文件的原因

    我遇到的问题是 Apache POI 仅通过读取和写入就 损坏 了 xlsm xlsx 文件 例如使用以下代码 public class Snippet public static void main String args throws
  • 在 Java 中将日期从 UTC 转换为 PST

    我需要将日期从 Google App Engine 本地服务器时区转换为 Java 中的太平洋时间 我尝试使用 Calendar calstart Calendar getInstance calstart setTimeZone Time
  • spring-data-neo4j 基本一对多关系不持久

    EDIT 示例项目可在github https github com troig neo4jCustomRepository 我在后端项目中使用 Neo4J Rest 图形数据库 托管在 grapheneDb 中 和 Spring Data
  • 如何生成源代码来创建我正在调试的对象?

    我的典型场景 我处理的遗留代码有一个错误 只有生产中的客户端才会遇到 我附加了一个调试器并找出如何重现该问题their系统给定their输入 但是 我还不知道为什么会发生错误 现在我想在本地系统上编写一个自动化测试来尝试重现然后修复错误 最
  • Spring JSON序列化、Gson反序列化

    我目前在某些内部对象的反序列化方面遇到问题 在春天 我在使用输出之前初始化所有对象 ResponseBody 例如 这是一个响应 id 1 location id 1 extra location data id 2 location 1
  • 连接到 Apache Kafka 多节点集群中的 Zookeeper

    我按照以下说明设置了多节点 kafka 集群 现在 如何连接到zookeeper 是否可以从 JAVA 中的生产者 消费者端仅连接到一个 ZooKeeper 或者是否有一种方法可以连接所有 ZooKeeper 节点 设置多节点 Apache
  • 如何在线程和小程序中使用双缓冲

    我有一个关于何时调用绘制和更新方法的问题 我有游戏小程序 我想在其中使用双缓冲 但我无法使用它 问题是 在我的游戏中 有一个球在 run 方法内移动 我想知道如何使用双缓冲来交换屏幕外图像和当前图像 请有人帮忙 当同时存在 update 和
  • Struts ActionForm 属性应该是什么类型?

    我使用 Struts 1 2 4 继承了这个巨大的遗留 Java Web 应用程序 我有一个关于 ActionForms 的具体问题 其中一些仅具有字符串属性 即使对于数字 其中一些使用看似合适的类型 整数 日期 字符串等 这里的最佳实践是
  • Play Framework 2.5.1 路由和依赖项注入(适用于 Java)

    我的 路线 文件中有这个 POST accounts controllers AccountsController createOneAccount 在我的 AccoutsController java 中 package controll
  • 阻止 GWT 中的事件冒泡

    我有以下代码片段 changeTextArea 是一个 TextArea 对象 changeTextArea addKeyboardListener new KeyboardListenerAdapter public void onKey
  • 如何制作一个向用户显示图像而不是文本的下拉列表?

    ObjectChoiceField 字段满足我的所有要求 但它并不漂亮 这就是我所拥有的 String pets Dog Cat Duck ObjectChoiceField dd new ObjectChoiceField My Pet
  • Windows:如何获取所有可见窗口的列表?

    无论如何都要使用相关技术重新标记 我不知道它们是什么 稍后我可能会提出更详细的问题 关于具体细节 但现在我正在尝试掌握 大局 我正在寻找一种方法来枚举 Windows 上的 真实可见窗口 我所说的 真正可见的窗口 就是指 用户所说的 窗口
  • 计算事件之间的天数 - Android

    我一直在研究 Android API 并一直在寻找一种方法来计算当前日期和未来日期之间的天数 我对 android 还很陌生 而且我已经有几年没有做过 java 了 计算这个最简单的方法是什么 Thanks 最简单的方法是使用乔达时间 ht
  • 为什么 writeObject 抛出 java.io.NotSerializedException 以及如何修复它?

    我有这个异常 我不明白为什么会抛出它 或者我应该如何处理它 try os writeObject element catch IOException e e printStackTrace Where element is a Transf
  • Java基于参数的同步(名为互斥锁/锁)

    我正在寻找一种根据接收到的参数来同步方法的方法 如下所示 public synchronized void doSomething name some code 我想要方法doSomething同步基于name参数如下 线程 1 doSom
  • DOM 中不再存在缓存元素

    就像在类似的问题中一样 我使用appium java 尝试选择元素 在移动应用程序中 我要转到页面 之后有许多元素 android widget ImageView 0 我需要选择 6 个 例如 这样的元素并执行其他步骤 Byt 只能选择一
  • startDrag 方法 已弃用且无法编译程序

    startDrag android content ClipData android view View DragShadowBuilder java lang Object int 已弃用 如何解决这个问题而又不失去对旧版本的兼容性 还有
  • 异步方法的同步版本

    在 Java 中创建异步方法的同步版本的最佳方法是什么 假设您有一个包含这两种方法的类 asyncDoSomething Starts an asynchronous task onFinishDoSomething Called when
  • 切换按钮形状不变

    我正在尝试制作一个带有绿色背景的圆形切换按钮 我用了
  • 指定不带组件的GridBagLayout的网格参数

    我试图帮助另一个用户 但遇到了一个问题 我想用 GridBagLayout 来做到这一点 c1 c2 c3 10 80 10 v v r1 B1

随机推荐

  • Next.js:嵌套动态路由的 getStaticPaths

    想象一下你有这样的数据结构 const data posts id 1 title Post 1 slug post 1 id 2 title Post 2 slug post 2 comments id 1 postId post 1 t
  • KDB:字符串与表的比较

    我有一张表 bb bb key1 0 1 2 1 7 col1 1 2 3 4 5 col2 5 4 3 2 1 col3 11 22 33 44 55 如何进行字符串的关系比较 假设我想获取 col3 小于或等于 33 的记录 selec
  • ssl 证书代码异常

    我与 sslStream 建立了客户端服务器套接字连接 但当代码到达行时 服务器上出现异常作为服务器进行身份验证我在互联网上搜索 但找不到为什么会发生这种情况的好答案 我在项目中创建了 pfx 测试文件 并为其设置了一个简单的密码 我不知道
  • codeigniter 中漂亮的 url 设置

    我有控制器 package 函数 tour package 和参数 1 的网址 http www mysite in package tour packages 1 http www mysite in package tour packa
  • SQL数值数据类型截断值?

    我真的希望那里的一些 SQL 专家可以帮助解决这个问题 如果之前已经回答过这个问题 我深表歉意 我确实尝试找到一篇类似的帖子 但无济于事 declare theanswer numeric 38 16 select theanswer 0
  • Facebook FQL 查询使所有用户在线

    我在本地 MySQL 数据库中保存了我的应用程序的所有用户的记录 我拥有获取用户在线状态所需的所有相关信息 UID access token并授予extended permission 如何获取所有用户的在线状态 我目前使用的方法是分别查询
  • 无法在 iOS 4 中播放视频

    我已经编写了在 iPhone OS 3 1 3 中播放视频的代码 并且视频播放正常 但是当我尝试使用相同的代码播放视频时 视频在 iOS 4 中无法播放 我知道 iOS 4 的媒体播放器框架已更改 有什么方法可以在不同的操作系统上播放视频而
  • 您是否发现本机 JSON 实现中存在任何错误? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何创建弹出窗口以在rails 3中创建新记录

    我们有一个要求 网页显示连接几个表的所有记录 我们有一个 添加按钮 单击该按钮后 我必须显示一个弹出窗口 用户将在其中输入必要的详细信息 弹出窗口将有两个按钮 保存 和 取消 单击 保存 按钮 应验证字段 如果所有验证均通过 则将记录保存到
  • “子例程条目中的宽字符” - UTF-8 编码的西里尔文字作为字节序列

    我正在开发一个带有大字典的 Android 文字游戏 这些单词 超过 700 000 个 作为单独的行保存在文本文件中 然后放入 SQLite 数据库中 为了保护我的字典 我想用 md5 对所有长度超过 3 个字符的单词进行编码 我不会混淆
  • http-proxy-middleware 不转发完整路径

    我正在尝试将 BrowserSync 配置为在服务器模式下工作 并将我的 API 请求代理到在同一计算机上不同端口上运行的后端 使用http 代理中间件 https github com chimurai http proxy middle
  • Python ast.literal_eval 在字典字符串上不起作用(SyntaxError:无效语法)

    我正在尝试使用 JSON 数据处理数据集 然而 数据未经解析就已写入文件 这意味着 python 字典作为字符串写入文件中 而不是作为字符串写入 JSON 对象 我找到了一个模块 AST 它可以使用以下命令再次将字符串转换为字典 ast l
  • docker --Windows 的卷格式

    我正在尝试使用我们在工作中使用的 shell 脚本来设置我们的开发环境 并将其重新调整为通过 Git Bash 在我的 Windows 环境中工作 shell脚本中启动容器的方式如下 docker run detach name serve
  • 在 Xcode 4.2 中的 UIWebView 中加载网页 - 如何正确连接 IBOutlet 并确保网页加载?

    大多数有关在 iPhone 应用程序中嵌入 UIWebView 的教程都基于旧版本的 Xcode 这是一个例子 http howtomakeiphoneapps com uiwebview tutorial 239 http howtoma
  • Launch4J - 如何将依赖的 jar 附加到生成的 exe

    我有一个简单的java项目 它需要外部jar 我使用 netbeans 构建它 在 Clean 和 Build 命令之后 我可以在 dist 目录中找到以下结构 myApp jar lib library1 jar library2 jar
  • 带有限制和排序的流星发布

    我有以下出版物 Meteor publish times function return Times find sort createdAt 1 limit 5 这将返回所有记录 忽略限制 然而这 Meteor publish times
  • Javascript 书签在 Firefox 13 中停止工作

    在 Firefox 版本 13 中 小书签 带有javascript 网址 例如javascript alert it works 停止工作 有没有什么解决办法可以使用javascript Firefox 13 中的书签 这是一个后果Bug
  • 如何确定我的 winform 位于哪个显示器?

    我浏览过这个网站 发现了很多有关 Screen 类以及如何计算监视器数量等的信息 但如何确定表单当前位于哪个监视器中 比使用边界更简单的方法是使用 Screen FromControl 方法 这与 Windows 使用的功能相同 Scree
  • 区别:cin.getline() 和 getline(cin, st)

    哪一种更好 更受青睐 我真的发现阅读 API 很混乱 会员版本读入char 免费版本读入std string 所以更喜欢免费版本 像这样使用它 std istream ins std string line while std getlin
  • 反应堆中的地图与平面地图

    我找到了很多关于RxJava https stackoverflow com questions 22847105 when do you use map vs flatmap in rxjava 但我想了解它在 Reactor 中是如何工