【问题标题】:what is the difference between map and doOnNext in flux ? (i.e project reactor)map 和 doOnNext influx 有什么区别? (即项目反应堆)
【发布时间】:2020-02-06 20:39:15
【问题描述】:

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

【问题讨论】:

    标签: reactive-programming spring-webflux reactive spring-reactive


    【解决方案1】:

    只是为了补充上面的好答案-我认为我开始使用doOnNext() 时缺少的一个重要部分是它不是“类似功能”map 的“消费者”对应部分和flatMap

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

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

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

    【讨论】:

    【解决方案2】:

    TLDR; Flux#doOnNext 用于副作用, Flux#map 用于将某物从一种类型同步映射到另一种类型。

    如果我们查看documentationdoOnNext 会显示以下内容

    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 函数可以做“doOnNext 函数可以做什么”。 doOnNext函数能做什么,map函数不能做什么?
    • 它不消耗物品,地图功能可以
    • IMO,doOnNext 提供了接收输入的不变性。在map 你没有。
    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 2023-03-04
    • 1970-01-01
    • 2011-08-18
    • 2018-03-08
    • 1970-01-01
    • 2013-06-27
    • 2016-08-18
    相关资源
    最近更新 更多