基础语法
无参数的情况 :
val/var 变量名 = { 操作的代码 }有参数的情况
val/var 变量名 : (参数的类型,参数类型,...) -> 返回值类型 = {参数1,参数2,... -> 操作参数的代码 }可等价于
// 此种写法:即表达式的返回值类型会根据操作的代码自推导出来。
val/var 变量名 = { 参数1 : 类型,参数2 : 类型, ... -> 操作参数的代码 }
- lambda表达式作为函数中的参数的时候,这里举一个例子:
fun test(a : Int, 参数名 : (参数1 : 类型,参数2 : 类型, ... ) -> 表达式返回类型){
...
}
例
源码
// 传入两个 int 值,返回之和
fun test(a : Int , b : Int) : Int{
return a + b
}
lambda
1 . val test : (Int , Int) -> Int = {a , b -> a + b}
// 或者
2 . val test = {a : Int , b : Int -> a + b}
第一种: 会限制返回值类型
- 在变量名后面接上传入的参数
- "->"后为返回值类型
- "{**}" 内 "->"前为传入的参数名
- "{**}" 内 "->"后为具体的方法
第二种: 不会限制返回值类型
- "{**}" 内 "->"前为传入的参数名和参数类型
- "{**}" 内 "->"后为具体的方法
返回值确定规则
"{**}" 内 "->"后,最后一个参数或者函数为默认返回值,不需要用 return
不同操作之间需要用回车区分(不能在同一行)
val test1: (Int, Int) -> Int = { a, b
->
" " // 操作一
for (i in 0..15) { // 操作二
}
a + b // 操作三 : 返回值
}
Lambda高阶函数
用java在实际开发中,如遇到以下情况
A.class 中,构造方法中一个接口作为参数,需要其他类实现.
private final AiTest aiTest;
public A(AiTest aiTest) {
this.aiTest = aiTest;
}
public interface AiTest {
int onAi();
}
B.class 中 , b()中生成A对象,并实现接口,return返回值
public void b() {
new A(new A.AiTest() {
@Override
public int onAi() {
int result = 66 + 99;
return result;
}
});
}
那么下面在kotlin用Lambda实现
A.class
fun aiTest (b : () -> Int) : Int{
return b.invoke()
}
B.class 中
fun b() {
A().aiTest { 66 + 99 }
}
invoke()函数:表示为通过函数变量调用自身,因为上面例子中的变量b是一个匿名函数。
在A.class括号中
b : () -> Int
与
val test : (Int , Int) -> Int = {a , b -> a + b}
中等号前半部分一样 ,后半部分在B.class类实现,从而达到了接口的效果
下划线(_)
在使用Lambda表达式的时候,可以用下划线(_)表示未使用的参数,表示不处理这个参数。
同时在遍历一个Map集合的时候,这当非常有用。
举例:
val map = mapOf("key1" to "value1","key2" to "value2","key3" to "value3")
map.forEach{
key , value -> println("$key \t $value")
}
// 不需要key的时候
map.forEach{
_ , value -> println("$value")
}
输出结果:
key1 value1
key2 value2
key3 value3
value1
value2
value3