Ale*_*der 5 coroutine kotlin kotlin-coroutines
为什么不能在Sequence :: map函数中调用Deferred :: await,就像在List :: map中一样?
我做了一个小例子
fun example() = runBlocking {
val list = listOf(1, 2, 3, 4)
list.map { async { doSomething(it) } }
.map { it.await() }
list.asSequence()
.map { async { doSomething(it) } }
.map { it.await() } // Error: Kotlin: Suspension functions can be called only within coroutine body
}
Run Code Online (Sandbox Code Playgroud)
如您所见,最后一个语句无法编译.
这是因为它list.map是一个inline fun,它可能是因为它是一个急切的操作,返回一个新的列表.一个inline fun可以容忍一个suspend块,因为它更像一个宏:它扩展到调用站点.只要呼叫站点在一个suspend块内,这就可以了.
sequence.map另一方面,它是懒惰的,当你从序列中提取项目时,它只会在最终执行的操作管道中添加另一个lambda.
与可挂起世界中的延迟序列最接近的是一个通道,但它改变了编程模型.
| 归档时间: |
|
| 查看次数: |
587 次 |
| 最近记录: |