map和doOnNext在变化中有什么区别?(即项目反应堆)



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

只是为了补充另一个不错的答案 - 我认为当我开始使用doOnNext()时我缺少的一个重要部分是它不是"类似功能"mapflatMap的"消费者"对应部分。

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

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的 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

这是一个典型的Java泛型模式,如果你想了解更多,我建议你看Joshua Blochs关于泛型的谈话。整个视频都很好看,会比我更好地解释它。

但我想指出的是,通过使用map,您将返回不同的类型。你得到一些从通量中super T的东西,然后将其映射到extends V的其他东西。

最新更新