当前位置: 首页 > 面试题库 >

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

叶允晨
2023-03-14
问题内容

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

这是一个例子:

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

我有文件(a Flux<FilePart>),我想将其复制到UPLOAD_ROOT服务器上的某些文件中。

本示例摘自一本书。

我可以将所有更改为.mapto .flatMap,反之亦然,一切仍然正常。我不知道有什么区别。


问题答案:
  • map 用于同步,非阻塞,一对一转换
  • flatMap 用于异步(非阻塞)1-to-N转换

区别在方法签名中可见:

  • map取a Function<T, U>并返回aFlux<U>
  • flatMap取a Function<T, Publisher<V>>并返回aFlux<V>

这是主要提示:您 可以 将传递Function<T, Publisher<V>>map,但它不知道如何处理Publishers,这将导致Flux<Publisher<V>>一系列惰性发布者。

另一方面,每个flatMap期望a 。它知道如何处理它:订阅它并在输出序列中传播它的元素。其结果,返回类型:将压扁每个内进入的输出序列 的所有
的第Publisher<V>``T``Flux<V>``flatMap``Publisher<V> __V

关于1-N方面:

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

但这就是简朴的情况。一般情况是a Publisher可以发出多个元素,并且flatMap效果也一样。

举例来说,假设您有一个反应型数据库,并且您从一系列用户ID中获取了flatMap,并且请求返回了用户的Badge。您最终Flux<Badge>将获得所有这些用户的所有徽章。

map 真的是同步和 非阻塞的 吗?

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

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



 类似资料:
  • 我已经找到了很多关于RxJava的答案,但我想了解它在Reactor中是如何工作的。 我目前的理解是非常模糊的,我倾向于认为map是同步的,flatMap是异步的,但我不能真正理解它。 以下是一个例子: 我有文件(a

  • 问题内容: 我想展平一个将键关联到的列表的a ,而不会丢失键映射。我很好奇,就好像它是可能的,与这样做有用的和。 我们从这样的东西开始: 假设mapFrom填充在某处,如下所示: 我们还假设列表中的值是唯一的。 现在,我想“展开”它以获得第二张地图,例如: 我可以这样做(或使用,非常类似): 现在,假设我要使用lambda而不是嵌套循环。我可能会做这样的事情: 我也尝试了,但是我不认为这是正确的方

  • 在闪光灯下,平面图也可以发出一条记录。似乎平面图可以代替地图。有人能告诉我这种情况下的区别吗?谢谢你。

  • 如何将此地图/平面图转换为便于理解的图形,请解释其工作原理,谢谢。

  • 我使用的是Flink 0.10.0数据流。这是我的要求。 我的源系统是广播消息的自定义系统。在我的自定义SourceFunction实现中,我实现了回调来侦听消息。 每个回调都会得到不同类型的消息。 我想解码/转换在回调中收到的对象发送到我的SinkFunction。我相信我可以用FlatMapFunction或类似的软件来完成。 因为我有各种回调,所以我听每个回调的解码逻辑是不同的。我想不能有一

  • 我是RxJava的新手,经常被平面图函数弄糊涂。根据文档,平面图 有人能给出一个很好的用例吗?为什么要将原来的可观察对象转换为可观察对象(复数),然后将它们转换为单个可观察对象。 你为什么不直接用“地图”呢? 如果你举一个Android的例子,那就太棒了,否则纯Java就足够了。谢谢