Lambda表达式#
Kotlin中的lambda表达式和Java中lambda表达式有相似的地方,也有不同的地方,建议同时对比学习,避免混淆java .参考Java中lambda表达式
1、定义
lambda表达式你可以理解成简化表达后的匿名函数;
- Labmbda表达式总是被大括号括着
- 定义lambda表达式不需要fun关键字,无须指定函数名
- 形参列表位于“->”之前声明,参数类型可以省略
- 函数体位于“->”之后
- 函数体的最后一个表达式自动作为Lambda表达式返回值,无须使用return关键字(正常情况下,lambda表达式钟不允许使用return关键字,如果要使用return关键字,必须是在内联函数(即该lambda表达式作为实参传入内联函数)
语法格式:
形参列表不用()括住;
{形参1,...->函数体}
如:
{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表达式赋值给变量,而变量声明时指定了类型,这时即可省略lambda表达式的形参类型
- 将lambda表达式作为函数实参传递给函数形参,方法定义时指定形参类型,lambda表达式也可以省略形参类型;
也可以直接在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
}
前面我们说当函数形参时可变参数时,应尽量将可变参数形参放在形参列表最后,但是这儿又建议将函数类型形参放在最后,就产生了一个问题:当两种类型形参都存在时,到底两者谁放在最后??
答案:应该将函数类型放在最后,这样函数类型的形参就不用使用命名参数;
3、lambda表达式作为作为函数式接口的实例
Java8中支持lambda表达式作为函数式接口实例,Kotlin也同样支持这功能:
Var r=Runnable{
......(run()方法实现)
}
本文介绍了Kotlin中的Lambda表达式,包括定义、调用方式和作为函数式接口的实例。详细阐述了如何定义和使用Lambda,特别是参数类型推断、省略形参列表以及在函数调用中的应用。
829

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



