【发布时间】:2020-02-06 20:39:15
【问题描述】:
In Flux map 函数也会对 Flux 中的每个项目执行。对于通量中的每个项目(发射),也会执行 doOnNext 函数。从用户的角度来看有什么区别?为什么存在两种类似的方法?可以用简单易用的方式解释。
【问题讨论】:
标签: reactive-programming spring-webflux reactive spring-reactive
In Flux map 函数也会对 Flux 中的每个项目执行。对于通量中的每个项目(发射),也会执行 doOnNext 函数。从用户的角度来看有什么区别?为什么存在两种类似的方法?可以用简单易用的方式解释。
【问题讨论】:
标签: reactive-programming spring-webflux reactive spring-reactive
只是为了补充上面的好答案-我认为我开始使用doOnNext() 时缺少的一个重要部分是它不是“类似功能”map 的“消费者”对应部分和flatMap。
doOnNext 是一种回调,当 Publisher 发出项目但不影响流程时执行,即它立即返回原始 Publisher。
示例:最初我认为我可以做类似的事情
Mono.from()
.doOnNext(doSomethingConsumer)
.doOnNext(thenDoSomethingElseConsumer);
当我对返回值不感兴趣时,这些东西会按顺序应用。
这是完全错误的!事实上,doOnNext() 两个运算符都会立即应用。
【讨论】:
TLDR;
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 中,我们可以做副作用,比如日志,或者在某处做一个休息调用等等。我们还返回一个 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 talk about generics。整个视频都很好看,会比我解释得更好。
但我想指出的是,通过使用 map,您返回的是 不同 类型。你从通量中得到super T 的东西,然后将其映射到extends V 的其他东西。
【讨论】:
map 你没有。