[英]Return first non-null value after transformation in Kotlin
我想在 Kotlin 中的元素列表转换后返回第一个非空值,所以是这样的:
suspend fun myFunction(): Any {
val firstNonNullId = this.mapNotNull{ it.id }
?.first{ transform(id) != null }
return transform(firstNonNullID)
}
编写这个 function 的更好、更惯用的方法是什么? 我想尽可能少地调用transform(it)
,所讨论的转换也是一个suspend
function。
编辑: asSequence()
解决方案在transform()
是suspend
function 时给出错误,因为它必须从协程主体调用。 即使整个myFunction()
是暂停 function,也会发生这种情况。当转换是暂停 function 时,解决方案应该是什么?
自 Kotlin 1.5 起,您可以使用firstNotNullOf
function 或其...OrNull
变体:
// returns the first non-null result of transform
this.firstNotNullOf { transform(it.id) }
firstNotNullOf
如果没有找到转换的非空结果,则抛出异常,并且firstNotNullOfOrNull
在这种情况下返回 null。
这两个函数都是内联的,因此当它们本身从挂起 function 调用时,应该可以在它们的 lambda 参数中调用挂起函数。
我建议使用 Kotlin序列:
this.asSequence()
.mapNotNull { it.id }
.mapNotNull { transform(it) }
.first()
由于序列评估是惰性的,您的转换 function 只会在调用 .first .first()
期间被调用,并且在获得第一个非空结果后不会被调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.