【发布时间】:2021-01-14 13:12:58
【问题描述】:
我想在 Kotlin 中转换元素列表后返回第一个非 null 值,所以是这样的:
suspend fun myFunction(): Any {
val firstNonNullId = this.mapNotNull{ it.id }
?.first{ transform(id) != null }
return transform(firstNonNullID)
}
编写此函数的更好、更惯用的方法是什么?我想尽可能少地调用transform(it),并且所讨论的转换也是suspend函数。
编辑:当transform() 是suspend 函数时,asSequence() 解决方案会出错,因为它必须从协程主体中调用。即使整个 myFunction() 是一个挂起函数,也会发生这种情况。转换为挂起函数时应该怎么解决?
【问题讨论】:
-
如果转换是挂起函数,您只能在协程中执行此操作。你上面的代码不也是这样吗?您是否需要转换集合中的每个项目,即使除了第一个元素之外您没有存储转换后的元素?
-
如果变换是挂起函数,整体功能也是挂起函数,那就可以了。然而,虽然整体函数是一个挂起函数,并且转换是从一个序列中调用的,但它不再是原始协程体的一部分。
-
我的另一个问题呢?我认为序列解决方案会在第一个元素之后跳过所有元素的转换,即使它确实有效。与您上面的代码相同。但是你说“第一个非值在转换之后”。
-
我不需要转换集合中的每个项目,这就是我使用
first而不是例如调用filterNotNull的原因。