gpt4 book ai didi

Kotlin 协程:在 Sequence::map 中调用 Deferred::await

转载 作者:IT老高 更新时间:2023-10-28 13:47:17 25 4
gpt4 key购买 nike

为什么不能像在 List::map 中那样在 Sequence::map 函数中调用 Deferred::await?

我做了一个小例子

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

}

如您所见,最后一条语句无法编译。

最佳答案

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

另一方面,

sequence.map 是惰性的,它只是将另一个 lambda 表达式添加到最终将执行的操作管道中,当您从序列中提取项目时。

在可挂起的世界中,与惰性序列最接近的匹配是 Flow,但它有一个不同的模型,您可以一次性将所有数据推送给您,而您可以从一个一个的惰性序列。

关于Kotlin 协程:在 Sequence::map 中调用 Deferred::await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53469065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com