ZetCode

Kotlin return 关键字

最后修改于 2025 年 4 月 19 日

Kotlin 中的 return 关键字是控制程序流程的基础。它退出函数和 lambda 表达式,可以选择性地返回一个值。本教程通过实际示例深入探讨了 return

基本定义

return 关键字终止函数执行并将控制权返回给调用者。在函数中,它可以返回与声明的返回类型匹配的值。在 lambda 表达式中,它具有针对局部和非局部返回的特殊行为。

基本函数返回

return 的最简单用法是退出一个函数并返回一个值。返回的值必须与函数的声明返回类型匹配。

BasicReturn.kt
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 关键字。表达式的结果将自动返回。

ImplicitReturn.kt
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 语句可以根据条件提前退出函数。这对于验证检查或边缘情况很有用。

EarlyReturn.kt
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 返回,请使用标签。

LambdaReturn.kt
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 作为其返回类型。这告知调用者有关行为的信息。

NothingReturn.kt
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 表达式中退出封闭函数。

AnonymousReturn.kt
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 与值需要限定语法。

LambdaValueReturn.kt
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 的最佳实践

来源

Kotlin 返回和跳转文档

本教程深入介绍了 Kotlin 的 return 关键字,展示了它在函数和 lambda 表达式中的使用。我们探讨了各种场景,包括提前返回、标签返回和特殊情况,如 Nothing。正确使用 return 可以使控制流程清晰,并使代码更易于维护。

作者

我的名字是 Jan Bodnar,我是一位热情的程序员,拥有多年的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我撰写了 1400 多篇文章和 8 本电子书。我拥有超过八年的编程教学经验。

列出 所有 Kotlin 教程