Kotlin Coroutines:在Sequence :: map中调用Deferred :: await

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)

如您所见,最后一个语句无法编译.

Mar*_*nik 7

这是因为它list.map是一个inline fun,它可能是因为它是一个急切的操作,返回一个新的列表.一个inline fun可以容忍一个suspend块,因为它更像一个宏:它扩展到调用站点.只要呼叫站点在一个suspend块内,这就可以了.

sequence.map另一方面,它是懒惰的,当你从序列中提取项目时,它只会在最终执行的操作管道中添加另一个lambda.

与可挂起世界中的延迟序列最接近的是一个通道,但它改变了编程模型.