在Flux中,map
函数也会针对flux中的每个项目执行。而doOnNext
函数也会在flux中每个(发射的)项目上执行。从用户的角度来看,这两者有什么区别?为什么存在两个类似的方法?能否通过一个简单的用例来解释一下?
在Flux中,map
函数也会针对flux中的每个项目执行。而doOnNext
函数也会在flux中每个(发射的)项目上执行。从用户的角度来看,这两者有什么区别?为什么存在两个类似的方法?能否通过一个简单的用例来解释一下?
只是想添加到其他好的答案 - 当我开始使用doOnNext()
时,我错过了一个重要的部分,那就是它不是“函数式”map
和flatMap
的 “消费者”对应物。
doOnNext
有点像在发布者发出项时执行的回调,但它不会影响流程,即它立即返回原始的发布者。
例如:最初我认为我可以做以下操作:
Mono.from()
.doOnNext(doSomethingConsumer)
.doOnNext(thenDoSomethingElseConsumer);
当我对返回值不感兴趣且这些操作将按顺序应用时。
这是完全错误的!实际上,两个doOnNext()
操作符会立即被应用。
简述: Flux#doOnNext
用于副作用,Flux#map
用于同步映射一个类型到另一个类型。
如果我们查看 documentation ,它对于 doOnNext
给出了以下说明:
Flux<T> doOnNext(Consumer<? super T> onNext)
Add behavior (side-effect) triggered when the Flux emits an item.
doOnNext
中,我们可以进行副作用操作,比如记录日志或在其他地方进行rest调用等等。我们还返回类型为T
的Flux,与doOnNext
接收到的相同,因此没有类型更改。Map
:Flux<V> map(Function<? super T,? extends V> mapper)
Transform the items emitted by this Flux by applying a synchronous function to
each item.
map
为其他内容。map
中的类型,我们可以看到map
会发出一些super T
,但它会返回一些extends V
的东西。map
,您将返回一个不同的类型。您从flux中获取一些super T
,然后将其映射为其他extends V
的东西。doOnNext
提供了接收到的输入的不可变性。但在 map
中则不然。 - Hexy