Kotlin return 关键字
最后修改于 2025 年 4 月 19 日
Kotlin 中的 return
关键字是控制程序流程的基础。它退出函数和 lambda 表达式,可以选择性地返回一个值。本教程通过实际示例深入探讨了 return
。
基本定义
return
关键字终止函数执行并将控制权返回给调用者。在函数中,它可以返回与声明的返回类型匹配的值。在 lambda 表达式中,它具有针对局部和非局部返回的特殊行为。
基本函数返回
return
的最简单用法是退出一个函数并返回一个值。返回的值必须与函数的声明返回类型匹配。
package com.zetcode fun add(a: Int, b: Int): Int { return a + b } fun main() { val result = add(5, 7) println(result) // Output: 12 }
此示例显示了一个带有显式返回的基本函数。add
函数接受两个整数并返回它们的总和。return
语句使用计算值退出函数。
单表达式函数中的隐式返回
Kotlin 允许在单表达式函数中省略 return
关键字。表达式的结果将自动返回。
package com.zetcode fun multiply(a: Int, b: Int): Int = a * b fun main() { val product = multiply(4, 5) println(product) // Output: 20 }
在这里,multiply
函数使用单表达式语法。a * b
的结果将自动返回,而无需显式的 return
语句。这使代码更简洁。
带有条件的提前返回
return
语句可以根据条件提前退出函数。这对于验证检查或边缘情况很有用。
package com.zetcode fun divide(a: Int, b: Int): Int? { if (b == 0) return null return a / b } fun main() { println(divide(10, 2)) // Output: 5 println(divide(10, 0)) // Output: null }
此函数检查除以零的情况,如果检测到则提前返回。返回类型为可空 Int (Int?
) 以适应无效输入的 null 返回。此模式可防止在条件失败时进一步执行。
从 Lambda 表达式返回
在 lambda 表达式中,return
默认退出封闭函数(非局部返回)。要仅从 lambda 返回,请使用标签。
package com.zetcode fun processNumbers(numbers: List<Int>, action: (Int) -> Unit) { numbers.forEach(action) } fun main() { processNumbers(listOf(1, 2, 3, 4)) { if (it == 3) return@processNumbers // local return println(it) } // Output: 1 2 4 }
这演示了 lambda 表达式中的标签返回。return@processNumbers
仅退出 lambda 表达式,而不是整个函数。如果没有标签,它将退出 main
。标签控制嵌套上下文中的返回范围。
使用 Nothing 类型的返回
永远不会正常返回(总是抛出异常)的函数可以声明 Nothing
作为其返回类型。这告知调用者有关行为的信息。
package com.zetcode fun fail(message: String): Nothing { throw IllegalArgumentException(message) } fun main() { val input = readLine() val number = input?.toIntOrNull() ?: fail("Invalid input") println("Number is $number") }
fail
函数总是抛出异常。其 Nothing
返回类型告诉编译器执行不会正常继续。这有助于类型推断并使代码意图更清晰。
在匿名函数中返回
匿名函数的行为类似于常规函数,关于 return
。返回退出匿名函数本身,这与 lambda 表达式不同,后者在 lambda 表达式中退出封闭函数。
package com.zetcode fun main() { val numbers = listOf(1, 2, 3, 4, 5) numbers.forEach(fun(number) { if (number == 3) return // local to anonymous function println(number) }) // Output: 1 2 4 5 }
在这里,return
仅退出匿名函数,而不是 main
。这与 lambda 行为不同。在某些情况下,与 lambda 表达式中的标签返回相比,匿名函数提供了更直观的返回语义。
在 Lambda 表达式中使用返回值
Lambda 表达式隐式返回其最后一个表达式的值。显式 return
与值需要限定语法。
package com.zetcode fun transform(numbers: List<Int>, transform: (Int) -> Int): List<Int> { return numbers.map(transform) } fun main() { val result = transform(listOf(1, 2, 3)) { if (it == 2) return@transform 20 // explicit return with value it * 10 // implicit return } println(result) // Output: [10, 20, 30] }
这显示了 lambda 表达式中的隐式和显式返回。当条件匹配时,显式返回值为 20。否则,lambda 表达式隐式返回 it * 10
。标签返回为转换提供值。
使用 return 的最佳实践
- 首选隐式返回: 尽可能使用单表达式函数以获得更简洁的代码。
- 使用提前返回: 首先验证输入和边缘情况,以获得更好的代码结构。
- 了解 lambda 返回: 记住 lambda 表达式默认使用非局部返回;根据需要使用标签。
- 考虑 Nothing: 使用
Nothing
返回类型标记永远不会正常返回的函数。 - 选择匿名函数: 当 lambda 返回行为令人困惑时,考虑使用匿名函数以获得更直观的返回。
来源
本教程深入介绍了 Kotlin 的 return
关键字,展示了它在函数和 lambda 表达式中的使用。我们探讨了各种场景,包括提前返回、标签返回和特殊情况,如 Nothing
。正确使用 return
可以使控制流程清晰,并使代码更易于维护。
作者
列出 所有 Kotlin 教程。