Kotlin:如何更简洁返回集合首个成功结果或最后失败结果
Kotlin惯用风格实现:返回首个成功Result,全失败则返回最后一个失败结果
你的需求是遍历集合元素,尝试每个元素后返回首个成功的Result;若所有尝试均失败,则返回最后一次的失败结果。以下是几种更符合Kotlin惯用风格的简洁实现:
方式一:简洁for循环(推荐,短路执行+逻辑清晰)
直接用for循环遍历,记录每次尝试结果,遇到成功立即返回,去掉了冗余的let嵌套,逻辑更直观:
fun returnFirstSuccess(keys: List<String>): Result { var lastResult: Result? = null for (key in keys) { lastResult = tryKey(key) if (lastResult is Result.Success) { return lastResult } } return lastResult!! }
这个版本保持了短路特性(遇到成功就停止后续尝试),代码清爽易读,是最贴合Kotlin惯用写法的方案。
方式二:run代码块封装
用run块包裹逻辑,避免临时变量污染外部作用域,同样支持短路执行:
fun returnFirstSuccess(keys: List<String>): Result = run { var lastResult: Result? = null keys.forEach { key -> lastResult = tryKey(key) if (lastResult is Result.Success) return@run lastResult } lastResult!! }
适合偏好函数式代码风格的场景,逻辑和for循环完全一致。
注意:避免非短路实现
不要使用map+firstOrNull的写法,因为它会提前执行所有tryKey调用,无法短路,在tryKey有副作用或耗时操作时会浪费性能:
// 不推荐:会执行所有tryKey调用,无短路特性 fun returnFirstSuccess(keys: List<String>): Result { val results = keys.map { tryKey(it) } return results.firstOrNull { it is Result.Success } ?: results.last() }
内容的提问来源于stack exchange,提问作者pixel
相关产品推荐
相关产品推荐

