Ref: > https://www.kotlincn.net/docs/tutorials/getting-started.html
Lambda 表达式语法
Lambda 表达式的完整语法形式如下:
val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }
lambda 表达式总是括在花括号中, 完整语法形式的参数声明放在花括号内,并有可选的类型标注, 函
数体跟在⼀个 -> 符号之后。如果推断出的该 lambda 的返回类型不是 Unit ,那么该 lambda 主体中
的最后⼀个(或可能是单个)表达式会视为返回值。
如果我们把所有可选标注都留下,看起来如下:
val sum = { x, y -> x + y }
传递末尾的 lambda 表达式
在 Kotlin 中有⼀个约定:如果函数的最后⼀个参数是函数,那么作为相应参数传⼊的 lambda 表达式可
以放在圆括号之外:
val product = items.fold(1) { acc, e -> acc * e }
这种语法也称为拖尾 lambda 表达式。
如果该 lambda 表达式是调⽤时唯⼀的参数,那么圆括号可以完全省略:
run { println("...") }
it:单个参数的隐式名称
⼀个 lambda 表达式只有⼀个参数是很常⻅的。
如果编译器⾃⼰可以识别出签名,也可以不⽤声明唯⼀的参数并忽略 -> 。 该参数会隐式声明为 it :
ints.filter { it > 0 } // 这个字⾯值是“(it: Int) -> Boolean”类型的
从 lambda 表达式中返回⼀个值
我们可以使⽤限定的返回语法从 lambda 显式返回⼀个值。 否则,将隐式返回最后⼀个表达式的值。
因此,以下两个⽚段是等价的:
ints.filter {
val shouldFilter = it > 0
shouldFilter
}
ints.filter {
val shouldFilter = it > 0
return@filter shouldFilter
}
这⼀约定连同在圆括号外传递 lambda 表达式⼀起⽀持 LINQ-⻛格 的代码:
strings.filter { it.length == 5 }.sortedBy { it }.map { it.toUpperCase() }
// 创建⼀个 Array<String> 初始化为 ["0", "1", "4", "9", "16"]
val asc = Array(5) { i -> (i * i).toString() }
网友评论