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 教程。