我目前的理解非常模糊,我倾向于认为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
服务器上的某些文件中。
本示例摘自一本书。
我可以将所有更改为.map
to .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
真的是同步和 非阻塞的 吗?
是的:它在操作员应用它的方式(一个简单的方法调用,然后操作员发出结果)上是同步的,并且在函数本身不应该阻止操作员调用它的意义上说是非阻塞的。换句话说,它不应该引入延迟。这是因为Flux
a总体上还是异步的。如果阻塞中间序列,则将影响其余的Flux
处理过程,甚至其他过程Flux
。
如果您的地图函数正在阻止/引入延迟,但无法将其转换为返回Publisher
,请考虑publishOn
/
subscribeOn
以抵消在单独线程上的阻止工作。
我已经找到了很多关于RxJava的答案,但我想了解它在Reactor中是如何工作的。 我目前的理解是非常模糊的,我倾向于认为map是同步的,flatMap是异步的,但我不能真正理解它。 以下是一个例子: 我有文件(a
问题内容: 我想展平一个将键关联到的列表的a ,而不会丢失键映射。我很好奇,就好像它是可能的,与这样做有用的和。 我们从这样的东西开始: 假设mapFrom填充在某处,如下所示: 我们还假设列表中的值是唯一的。 现在,我想“展开”它以获得第二张地图,例如: 我可以这样做(或使用,非常类似): 现在,假设我要使用lambda而不是嵌套循环。我可能会做这样的事情: 我也尝试了,但是我不认为这是正确的方
在闪光灯下,平面图也可以发出一条记录。似乎平面图可以代替地图。有人能告诉我这种情况下的区别吗?谢谢你。
如何将此地图/平面图转换为便于理解的图形,请解释其工作原理,谢谢。
我使用的是Flink 0.10.0数据流。这是我的要求。 我的源系统是广播消息的自定义系统。在我的自定义SourceFunction实现中,我实现了回调来侦听消息。 每个回调都会得到不同类型的消息。 我想解码/转换在回调中收到的对象发送到我的SinkFunction。我相信我可以用FlatMapFunction或类似的软件来完成。 因为我有各种回调,所以我听每个回调的解码逻辑是不同的。我想不能有一
我是RxJava的新手,经常被平面图函数弄糊涂。根据文档,平面图 有人能给出一个很好的用例吗?为什么要将原来的可观察对象转换为可观察对象(复数),然后将它们转换为单个可观察对象。 你为什么不直接用“地图”呢? 如果你举一个Android的例子,那就太棒了,否则纯Java就足够了。谢谢