【问题标题】:What makes Iterable.map work with suspend functions?是什么让 Iterable.map 与挂起函数一起工作?
【发布时间】:2019-06-20 21:16:30
【问题描述】:

一般来说,suspend funs 不能用来代替普通的funs。如果你尝试直接从普通的fun 调用suspend fun,你会得到一个编译时错误。

This blog post 提到你可以通过编写在 Kotlin 中做一个并发映射

list.map { async { f(it) } }.map { it.await() }

为什么第二个map 编译?您通常不能通过suspend fun 代替fun。是吗

  • mapinline fun,并且自动推断为“上游”暂停
  • map 是 Kotlin 以某种方式特殊处理的
  • 还有别的吗?

【问题讨论】:

    标签: kotlin kotlin-coroutines


    【解决方案1】:

    该地图是一个内联的乐趣,并且暂停自动推断为“上游”

    是的。内联后检查暂停功能。我在文档中看不到明确提及这一点,但Coroutines KEEP 中有一个:

    注意:暂停 lambda 可能会在其代码的所有允许来自该 lambda 的非本地 return 语句的地方调用暂停函数。也就是说,允许在内联 lambda 中暂停函数调用,如 apply{} 块,但不允许在 noinline 或跨内联内部 lambda 表达式中。暂停被视为一种特殊的非本地控制转移。

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 2023-02-02
      • 1970-01-01
      • 2016-12-13
      • 2016-10-06
      • 2011-11-30
      相关资源
      最近更新 更多