在 Flux 中,还为通量中的每个项目执行映射函数。对于通量中的每个项目(发射),也会执行 doOnNext 函数。从用户的角度来看有什么区别?为什么存在两种类似的方法?可以用简单的易用性来解释。
2 回答
只是为了补充上面的好答案-我认为我开始使用时缺少的一个重要部分doOnNext()
是它不是“类函数”map
和flatMap
.
doOnNext
是一种在 Publisher 发出项目但不影响流程时执行的回调,即它立即返回原始 Publisher 。
示例:最初我认为我可以做类似的事情
Mono.from()
.doOnNext(doSomethingConsumer)
.doOnNext(thenDoSomethingElseConsumer);
当我对返回值不感兴趣并且这些东西将按顺序应用时。
这是完全错误的!事实上,这两个doOnNext()
运算符都会立即应用。
TLDR;
Flux#doOnNext
用于副作用,
Flux#map
用于将某物从一种类型同步映射到另一种类型。
如果我们查看文档,它会说明以下内容doOnNext
Flux<T> doOnNext(Consumer<? super T> onNext)
Add behavior (side-effect) triggered when the Flux emits an item.
这意味着在 中doOnNext
,我们可以做一些副作用,比如日志,或者在某处做一个休息调用等等。我们还返回一个类型为 T 的通量,这与接收的相同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
这是一个典型的 java 泛型模式,如果您想了解更多,我建议您观看Joshua Blochs 谈论泛型。整个视频是一个很好的手表,并且会比我更好地解释它。
但我想指出的是,通过使用 map,您返回的是不同的类型。你super T
从通量中得到一些东西,然后你把它映射到其他东西上extends V
。