官方文档
使用
- 完整语法
lambda 表达式总是括在花括号中, 完整语法形式的参数声明放在花括号内,并有可选的类型标注,函数体跟在一个 -> 符号之后。如果推断出的该 lambda 的返回类型不是 Unit,那么该 lambda 主体中的最后一个(或可能是单个)表达式会视为返回值。
lambda表达式总是在花括号内!!,其参数可以放在花括号里面!!
val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }
- 如果函数的最后一个参数是函数,那么作为相应参数传入的 lambda 表达式(就是大括号)可以放在圆括号之外:
val product = items.fold(1) { acc, e -> acc * e }
val thread = Thread(){ } // lambda 是函数的最后一个参数
- lambda表达式为调用的唯一参数,那么圆括号可以完全省略
run { println("...") }
val thread = Thread{ } // 只有一个参数,且为lambda表达式
- 没有参数:可以省略 -> 符号
val thread = Thread({ })
- it:单个参数的隐式名称
一个 lambda 表达式只有一个参数是很常见的。如果编译器自己可以识别出签名,也可以不用声明唯一的参数并忽略 ->。 该参数会隐式声明为 it
ints.filter { it > 0 } // 这个字面值是“(it: Int) -> Boolean”类型的
- 闭包编译完后为匿名函数的形式,最多支持22个参数,如果需要新增,则需要自定义新的方法
// 声明
val acho = { name : String ->
println(name)
}
匿名函数
如果需要显示指定函数的返回类型,可以使用匿名函数
fun(x : Int, y : Int) : Int = x +y
//代码块:
fun(x : Int,y : Int) : Int {
return x + y
}
参数和返回类型的指定方式与常规函数相同,除了能够从上下文推断出的参数类型可以省略:
ints.filter(fun(item) = item > 0)
匿名函数的返回类型推断机制与正常函数一样:对于具有表达式函数体的匿名函数将自动推断返回类型,而具有代码块函数体的返回类型必须显式指定(或者已假定为 Unit)。
请注意,匿名函数参数总是在括号内传递。 允许将函数留在圆括号外的简写语法仅适用于 lambda 表达式。
Lambda表达式与匿名函数之间的另一个区别是非局部返回的行为。一个不带标签的 return 语句总是在用 fun 关键字声明的函数中返回。这意味着 lambda 表达式中的 return 将从包含它的函数返回,而匿名函数中的 return 将从匿名函数自身返回。
本文深入探讨了Kotlin中的lambda表达式和匿名函数的使用,包括它们的语法、参数传递方式、返回类型推断及非局部返回行为。通过实例讲解了lambda表达式在不同场景下的应用,如作为函数参数、在代码块中使用等。
1140

被折叠的 条评论
为什么被折叠?



