【问题标题】:Flow reducing operations expect suspend function减少流量的操作需要挂起功能
【发布时间】:2023-03-31 14:45:01
【问题描述】:

我不明白为什么 Kotlin Flow 减少,折叠函数的签名如下:

public suspend fun <S, T : S> Flow<T>.reduce(operation: suspend (accumulator: S, value: T) -> S): S

public suspend inline fun <T, R> Flow<T>.fold(
    initial: R,
    crossinline operation: suspend (acc: R, value: T) -> R): R

为什么operation 必须是可暂停的?流程本身是异步的,这一点很清楚,但归约操作很可能非常便宜。操作应该仅在发出下一个值时调用。允许在 operation 中暂停只会打开一堆蠕虫,因为这两个函数都应该累积值,而不是做一些 IO 繁重或长时间运行的事情。

【问题讨论】:

    标签: kotlin kotlin-coroutines


    【解决方案1】:

    为什么操作必须是可暂停的?

    允许内部暂停操作只会打开一罐蠕虫

    您的问题似乎将“必须”与“可能”混为一谈。该操作不必是可暂停的,但 Kotlin 允许这样做。它根本没有固执己见,并且允许在此处使用可挂起的功能,就像在 Flow API 中的其他任何地方一样。如果它不允许,我敢肯定会有 100 倍以上的用户询问为什么在所有其他操作中,reduce 被降级为不可暂停的操作。

    无论如何,正如您所说,“蠕虫罐头”对我来说似乎并不危险。您所冒的风险只是性能,而且您还以许多其他方式冒着风险,例如编写阻塞代码而不是暂停代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 2021-12-28
      • 2020-11-01
      • 2012-02-24
      • 2015-10-07
      • 2018-06-15
      • 2011-03-26
      相关资源
      最近更新 更多