通常,suspend fun
不能代替普通的fun
。如果您尝试直接从普通的suspend fun
调用fun
,则会出现编译时错误。
This blog post提到您可以通过编写
在Kotlin中进行并发映射list.map { async { f(it) } }.map { it.await() }
第二个map
为什么要编译?通常,您不能通过suspend fun
来代替fun
。是
map
是inline fun
,并且暂停被自动推断为“上游” map
答案 0 :(得分:4)
该地图是一种内联乐趣,并且暂停会自动推断为“上游”
是的。内联后, 会检查暂停的乐趣。我在文档中看不到对此的明确提及,但是Coroutines KEEP中有一个:
注意:暂停的lambda可以在其代码的所有位置(允许该lambda进行非本地返回语句)调用暂停函数。也就是说,允许在内联lambda(例如apply {}块)中使用暂停函数调用,但不允许在noinline或跨内联内部lambda表达式中使用。暂停被视为一种特殊的非本地控制权转移。