5

在 Flux 中,还为通量中的每个项目执行映射函数。对于通量中的每个项目(发射),也会执行 doOnNext 函数。从用户的角度来看有什么区别?为什么存在两种类似的方法?可以用简单的易用性来解释。

4

2 回答 2

12

只是为了补充上面的好答案-我认为我开始使用时缺少的一个重要部分doOnNext()是它不是“类函数”mapflatMap.

doOnNext是一种在 Publisher 发出项目但不影响流程时执行的回调,即它立即返回原始 Publisher 。
示例:最初我认为我可以做类似的事情

Mono.from()
    .doOnNext(doSomethingConsumer)
    .doOnNext(thenDoSomethingElseConsumer);

当我对返回值不感兴趣并且这些东西将按顺序应用时。
这是完全错误的!事实上,这两个doOnNext()运算符都会立即应用。

于 2020-11-04T13:52:12.290 回答
10

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

于 2020-02-06T23:32:34.983 回答