繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM