是什么让Iterable.map与暂停功能一起工作?

时间:2019-06-20 21:16:30

标签: kotlin kotlin-coroutines

通常,suspend fun不能代替普通的fun。如果您尝试直接从普通的suspend fun调用fun,则会出现编译时错误。

This blog post提到您可以通过编写

在Kotlin中进行并发映射
list.map { async { f(it) } }.map { it.await() }

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

  • mapinline fun,并且暂停被自动推断为“上游”
  • 科特林以某种方式特殊地map
  • 还有别的吗?

1 个答案:

答案 0 :(得分:4)

  

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

是的。内联后, 会检查暂停的乐趣。我在文档中看不到对此的明确提及,但是Coroutines KEEP中有一个:

  

注意:暂停的lambda可以在其代码的所有位置(允许该lambda进行非本地返回语句)调用暂停函数。也就是说,允许在内联lambda(例如apply {}块)中使用暂停函数调用,但不允许在noinline或跨内联内部lambda表达式中使用。暂停被视为一种特殊的非本地控制权转移。