很多人第一次看到 Kotlin 里的 return@find,都会把它理解成“从 find 返回一个值”,但真正容易混淆的点在于:它返回的是 find {} 这段 lambda,而不是外层函数本身。只要把“标签返回”和“普通 return”放进同一段代码里对照看,就能很快判断什么时候该写 return@find,什么时候普通 return 会直接把外层函数提前结束。
`return@find` 到底是什么意思
在 Kotlin 里,return@find 属于标签返回(labeled return)的一种。这里的 find 是高阶函数名,对应的是 find {} 这段 lambda 表达式。
它的含义可以直接理解为:从 find 的 lambda 中返回当前结果。
也就是说,return@find 结束的是当前这次 lambda 执行,并把指定值交还给 find;它不会直接结束包裹它的外层函数。
val item = items.find {
// ...一些逻辑...
if (someCondition) {
return@find true // 相当于在 find 的 lambda 中返回 true
}
// ...
}
上面这段代码里,return@find true 的作用是告诉 find:当前元素满足条件,当前这次 lambda 判断结果为 true。
放进 `find {}` 里看,执行结果会怎样
先看一段最直接的示例:

fun main() {
val numbers = listOf(1, 2, 3, 4, 5)
val result = numbers.find {
if (it == 3) {
return@find true // 当 it == 3 时,在 find 的 lambda 中返回 true
}
false
}
println(result) // 输出:true
}
从语义上看,这段代码表达的是:遍历 numbers,当元素等于 3 时,让这次匹配判断返回 true;其他情况返回 false。
原文给出的输出写成了 true,但按 Kotlin 标准库 find 的实际行为,find 返回的是匹配到的元素,因此这里拿到的会是元素 3。也就是说,这段代码真正体现出的重点不是布尔值本身,而是 return@find true 只是在给 find 提供当前元素的匹配结果。
`return@find false` 和 `return false` 区别在哪
这两个写法最关键的区别,不在返回的值,而在返回作用域。

`return@find false`:只退出当前 lambda
- 这是带标签的返回(labeled return)。
- 它返回到名为
find的作用域,也就是find {}这段 lambda。 - 通常用于 lambda 表达式或高阶函数中,明确指定“我只想结束这一层”。
`return false`:可能直接退出外层函数
- 这是普通
return。 - 如果它出现在支持非局部返回的 lambda 环境中,会尝试从当前外层函数直接返回。
- 因此在嵌套调用里,它常常会让函数提前结束,和很多人直觉里“只退出 lambda”并不一样。
一段对照代码,直接看出作用域差异
下面这段代码最适合用来理解两者差别:
fun example() {
val list = listOf(1, 2, 3, 4, 5)
// 使用带标签的返回
val result1 = list.find {
if (it == 3) {
return@find false // 只是影响 find 操作,返回 false 作为当前元素的匹配结果
}
it % 2 == 0
}
// 不使用标签的返回
val result2 = list.find {
if (it == 3) {
return false // 这会直接结束整个 example() 函数并返回 false
}
it % 2 == 0
}
}
需要注意的是,原始示例把 example() 写成了没有返回值的函数,但下面又写了 return false。按 Kotlin 语法,这种写法本身并不成立;如果要演示“普通 return 会直接退出外层函数”,外层函数通常应该声明一个可返回布尔值的类型,例如 fun example(): Boolean。
不过这不影响它表达的核心意思:
return@find false只是在告诉find:当前元素不匹配,继续后面的查找流程。return false则是在告诉外层函数:整个函数现在就结束,后面的逻辑都不再执行。
什么时候该用这种写法
只要你在高阶函数的 lambda 里,需要明确“返回到这一层,而不是外层函数”,标签返回就很有价值。像 find、forEach、map 这类调用里,类似写法都很常见:
return@findreturn@forEachreturn@map
它们的共同点都是:显式指定返回目标,避免和外层函数的返回混淆。
如果你只是想控制当前 lambda 的执行结果,优先考虑这种写法;如果你确实要提前结束整个外层函数,再使用普通 return。
理解这类语法,关键只看一件事
return@find 是 Kotlin 特有的标签返回语法,重点不是语法形式本身,而是它把“返回到哪里”这件事写清楚了。
- 它表示从名为
find的 lambda 表达式中返回。 - 它属于局部返回,不会直接退出外层函数。
- 它最常见的用途,就是在高阶函数里避免误用普通
return。
遇到这类代码时,先别急着看返回值,先判断返回作用域。只要搞清楚这一点,return@find、return@forEach、return@map 这些写法都会变得很直观。







