lambda表达式,称为匿名函数,是一种函数字面值,也就是没有声明的函数,但可以作为表达式传递出去.
函数类型:
对于接受另一个函数的作为自己的参数,必须针对这个参数指定一个函数的类型如
fun <T>max(collection: Collection<T>,less:(T,T)->Boolean):T?{ var max :T?=null for (it in collection){ if (max==null ||less(max,it)) max=it } return max }
参数less的类型(T,T)->Boolean ,也就是说,它是一个函数,接受二个T类型的参数,并且返回一个Boolean类型的结果
lambda表达式语法
val sun = { x: Int, y: Int -> x + y }
表达式包含在大括号之内,在完整的语法形式中,参数声明在小括号中,参数类型可选,函数体在->符合之后,如果lambda表达式自动推断的返回值类型不是Unit,那么在lambda表达式函数体中,最后一条表达式的值会被当做整个lambda表达式的返回值
匿名函数
ints.filter(fun(item)=item >0)
对于匿名函数,返回值类型的自动推断方式与通常函数的一样,如果函数体是一个表达式,那么返回值类型可以推断得到,如果函数体是多条语句组成的代码段,则返回值类型必须明确指定
注意:匿名函数参数一定在小括号内传递,允许将函数参数写在小括号之外的语法,仅对lambda表达式有效.
闭包
var sum = 0 ints.filrter(it>0).forEach( sum+=it ) print(sum)
lambda表达式匿名函数可以访问它的闭包,也就是定义在外层范围的变量.,