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

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(使用前将#替换为@)

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

随机推荐

  • 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 中是如何工