【问题标题】:How to inline function map on Flux or Mono object in Kotlin and Project Reactor如何在 Kotlin 和 Project Reactor 中的 Flux 或 Mono 对象上内联函数映射
【发布时间】:2019-05-19 18:50:00
【问题描述】:

我正在尝试使用 Kotlin 和 Project Reactor 开发一个演示应用程序,我想在 FluxMono 等对象上内联一些函数,如 map

我是这样做的:

private inline fun Flux<Account>.map(noinline transformer: (Account) -> AccountDTO): Flux<AccountDTO> {
    return this.map(transformer)
}

但这不行,因为我收到了来自 IDEA 的以下警告:

Expected performance impact of inlining 'private open inline fun Flux<Account>.map(noinline transformer: (Account) -> AccountDTO): Flux<AccountDTO> defined in com.freesoft.reactiveaccountservice.api.controller.AccountController' is insignificant. Inlining works best for functions with parameters of functional types.

有谁知道我如何实现这个内联函数或者实现它是否重要?

发送!

【问题讨论】:

    标签: kotlin project-reactor


    【解决方案1】:

    只要您只是调用 Java 中定义的非内联 map,就不会有任何好处。您原则上可以查看 Java 定义,并将其转换为 Kotlin,并使其成为您的内联 map 的定义,但(不检查)我希望它只是类似于 return new MapFlux(...) 的东西,可能不会两者都不会受益,因为 lambda 需要存储在一个字段中。

    因此,您需要在 Kotlin 中重新实现该库的相当一部分。

    【讨论】:

    • 好的。我已经阅读了更多关于此的内容,并且我认为现在我以某种方式理解了哪些函数应该被内联并且在这种情况下映射是不值得的。如果我在集合上有一张地图而不是 Mono/Flux 对象,那么地图值得内联,对吧?
    • “价值内联”主要取决于函数的定义,而不是函数的描述。但一般来说,是的(如果您不将 Java 流视为集合)。
    【解决方案2】:

    通常,您希望内联 lambda 函数,这些函数会传递给 higher-order 函数,因为它可以减少运行时开销。内联 lambda 时,不会在运行时创建匿名类和函数引用对象。在您的情况下,内联不会提高性能,因为它是一个常规函数。您可以通过示例阅读完整的解释here

    【讨论】:

      猜你喜欢
      • 2019-01-07
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      相关资源
      最近更新 更多