官方文档

官方文档

使用
  • 完整语法

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 将从匿名函数自身返回。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐