版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Leslie_LN/article/details/82805092
Lambda表达式#
1、定义
- Labmbda表达式总是被大括号括这
- 定义lambda表达式不需要fun关键字,无须指定函数名
- 形参列表位于“->”之前声明,参数类型可以省略
- 函数体位于“->”之后
- 函数体的最后一个表达式自动作为Lambda表达式返回值,无须使用return关键字
如:
{a:Int,b:Int-> a*b}
{it* it}
- 当只有一个形参时,可以同时省略形参类型、形参名,那么此时"->"不需要了,lambda表达式可以通过it来代表形参;
- 第三条省略形参列表参数类型的前提是:可以通过上下文(lambda表达式赋值的变量类型)推断出形参类型:
如:
var result:(Int)-> Int={n->n*n}
但是下面这种就不行,会报错:
var result={n->n*n}
1.1 调用Lambda表达式
可以像函数一样,将lambda表达式赋值给变量
var a:(Int)->Int={it *it}
a(3)
或者lambda表达式作为函数(函数类型形参的函数)调用的实参
list.dropWhile(e->e.lenth>4)
这里由于dropWhile()函数的函数形参(形参类型为(T->boolean))便可以推断出这里e变量的数据类型,因此可以这里可以省略形参类型;
也可以直接在lambda表达式后面调用:
{a:Int->a*a}(3)
2、函数的最后的一个形参是函数类型
函数最后一个形参时函数类型,如果你打算传入一个Lambda表达式实参,允许将lambda表达式写在圆括号之外;
如:
fun foo(a:Int ,b:(Int)->Int):Unit{
........
}
调用时:
foo(4){
e->e*e
}
如果函数就只有一个函数类型形参,如果你打算传入一个lambda表达式实参,除了可以将lambda表达式写在圆括号外面,这是可以将圆括号省略
fun foo(a:(Int)->Int){
....
}
调用:
foo{
e ->e*e
}