在 Kotlin 中返回转换后的第一个非空值

Bub*_*ees 5 list kotlin

我想在 Kotlin 中的元素列表转换后返回第一个非空值,所以像这样:

suspend fun myFunction(): Any {
    val firstNonNullId = this.mapNotNull{ it.id }
        ?.first{ transform(id) != null }

    return transform(firstNonNullID)
}
Run Code Online (Sandbox Code Playgroud)

编写这个函数的更好、更惯用的方法是什么?transform(it)我想尽可能少地调用,并且所讨论的转换也是一个suspend函数。

编辑:当是函数时,解决asSequence()方案会给出错误,因为它必须从协程主体调用。即使整体是一个挂起函数,也会发生这种情况。当转换是挂起函数时,解决方案应该是什么?transform()suspendmyFunction()

Ily*_*lya 8

从 Kotlin 1.5 开始,您可以使用firstNotNullOf函数或其...OrNull变体:

// returns the first non-null result of transform
this.firstNotNullOf { transform(it.id) }  
Run Code Online (Sandbox Code Playgroud)

firstNotNullOf如果未找到非 null 转换结果,则抛出异常,并firstNotNullOfOrNull在这种情况下返回 null。

这两个函数都是内联的,因此当它们本身从挂起函数调用时,应该可以在其 lambda 参数中调用挂起函数。