Lambda表达式语法
- Lambda表达式要用花括号包裹
- 参数在-> 之前声明(参数可能省略)
- 执行内容跟在 -> 之后(如果提供的话)
lambda在kotlin中函数类型常量
Lambda表达式在kotlin中的应用很广泛,lanbda作为函数类型常量使用,两种引用方式,第一种是显式,第二种隐式(隐藏了参数和返回值部分)
: (形参类型) -> 返回值类型 = {方法实现模块}
例如:var m03: (Int, Int) -> Int = { a, b -> a + b }
= {具体参数名&类型 -> 方法实现模块}
例如:var m04 = { a: Int, b: Int -> a + b }
其中方法必须有具体的实现才能正确调用函数,否则报错
几种写法举例,代码里注释都很清楚,手打多熟悉熟悉
fun main(args: Array<String>) {
//() -> Unit 相当于java的一个空参函数,返回值也为空,方法名是m01()
// 可以定义,但是不能调用
//todo 因为没有具体实现
var m01: () -> Unit
// m01()// 调用报错
var m02: (Int, Int) -> Int
// m02(1,2)// 也不能调用,因为也没有具体实现
// todo 定义包括两种方式, : (行参类型) ||| = {具体参数名}
var m03: (Int, Int) -> Int = { a, b -> a + b }
println("m03 : ${m03(2, 3)}")
// 与m03方法一样,只是写法不同,此种写法返回值没法定,会根据返回值自己确定
var m04 = { a: Int, b: Int -> a + b }
println("m04 : ${m04(2, 3)}")
// 自动得到返回值是Unit,即没有返回值
var m05 = { s1: String -> println("s1:$s1") }
m05("ssss")
// 返回值根据方法实现,得到返回值是double
var m06 = { a1: Int, a2: Int -> a1 + a2.toDouble() }
println("m06 : ${m06(1, 2)}")
var m07: (Int) -> String = {
when (it) {
1 -> "是1"
in 10..20 -> "10到20"
else -> "是其他$it"
}
}
println("m07 : ${m07(99)}")
var m08: (String, String) -> Unit = { s1, s2 ->
println("s1:$s1,s2:$s2")
}
m08("aaa", "bbb")
var m09 = { println("这是一个无参无返回值的函数") }
m09()
var m10: (Char) -> Unit = {
if (it == 'M') println("男的") else println("女的")
}
m10('W')
// 既可以打印,又有返回值
var m11: (String, Int) -> String = { name, age ->
println("name :$name,age :$age")
name + age
}
println("m11 : ${m11("www", 13)}")
}
打印得到结果:
m03 : 5
m04 : 5
s1:ssss
m06 : 3.0
m07 : 是其他99
s1:aaa,s2:bbb
这是一个无参无返回值的函数
女的
name : www , age : 13
m11 : www13