Lambda表达式
Lambda表达式本质就是匿名函数,它的出现减少了代码量,同时也使代码变得更加简洁明了。Lambda是函数式编程的基础。
Lambda语法
在Kotlin中,Lambda表达式语法格式如下
代码语言:javascript复制// 1.无参数
val 函数名 = { 函数体 }
// 2.有参数
val 函数名: (参数1类型, 参数2类型, ...) -> 返回值类型 = {参数1, 参数2, ... -> 函数体 }
// 表达式返回值类型可根据代码自动推导,所以等价于
val 函数名 = {参数1: 类型1, 参数2: 类型2, ... -> 函数体}
// 3.匿名函数
val 函数名 = fun(参数1: 类型1, 参数2: 类型2, ...): 返回值类型 {
函数体
}
注:Lambda的函数体是可以多行的,返回的是函数体最后一行的返回值。这是因为Kotlin是表达式语法,而不同于Java的声明式语法,Java的表达式是没有返回值的,在Kotlin中任何一句表达式都有返回值。
Lambda表达式具体实例如下
- 无参数
val say = { println("hello") }
// 相当于
fun say() {
println("hello")
}
- 有参数
val sum: (Int, Int) -> Int = {a, b -> a b}
// 等价于
val sum = {a: Int, b: Int -> a b}
// 相当于
fun sum(a: Int, b: Int): Int {
return a b
}
- 匿名函数
val sum = fun(a: Int, b: Int): Int {
return a b
}
// 相当于
fun sum(a: Int, b: Int): Int {
return a b
}
高阶函数
高阶函数是指将函数作为函数的参数或返回值。
先以一个简单的例子引出
代码语言:javascript复制fun main() {
val res = calc(5, 3, ::sum)
println("res = $res")
// 输出结果: res = 8
}
fun calc(a: Int, b: Int, f: (a: Int, b: Int) -> Int): Int {
return f(a, b)
}
fun sum(a: Int, b: Int): Int {
return a b
}
可以看出上面代码中,定义了一个calc函数,它最后一个参数f: (a: Int, b: Int) -> Int
表示接受一个函数引用,函数体内调用了最后一个参数指向的函数。随后定义了sum函数,该函数类型符合calc函数第三个参数。::sum
表示sum函数的引用,calc(5, 3, ::sum)
这一句就相当于执行了sum(5, 3)
,所以输出结果为8
然后用Lambda表达式改写sum函数
代码语言:javascript复制fun main() {
val sum = {a: Int, b: Int -> a b}
val res = calc(5, 3, sum)
println("res = $res")
// 输出结果: res = 8
}
fun calc(a: Int, b: Int, f: (a: Int, b: Int) -> Int): Int {
return f(a, b)
}
直接定义了一个Lambda表达式,赋值给了sum,直接将sum传入calc函数,同样输出了8。
接着直接将Lambda定义在函数调用的参数列表中
代码语言:javascript复制fun main() {
val res = calc(5, 3, {a: Int, b: Int -> a b})
println("res = $res")
// 输出结果: res = 8
}
fun calc(a: Int, b: Int, f: (a: Int, b: Int) -> Int): Int {
return f(a, b)
}
在Kotlin中调用高阶函数时,如果最后一个参数为Lambda表达式时,可以将函数调用的括号前移
代码语言:javascript复制val res = calc(5, 3, {a: Int, b: Int -> a b})
// 等价于
val res = calc(5, 3) {a: Int, b: Int -> a b}
特别地,当高阶函数只有有一个参数时,前移的括号还可以省略
代码语言:javascript复制fun main() {
show({ println("hello") })
// 等价于(括号前移)
show() {
println("hello")
}
// 等价于(省略前移的括号)
show {
println("hello")
}
// 输出结果: hello
}
fun show(f: () -> Unit) { // Unit相当于其他编程语言的void类型
f()
}
其他更深入内容请等笔者补充 ~~~ (又开始偷懒了QAQ)
本文作者: Ifan Tsai (菜菜)
本文链接: https://cloud.tencent.com/developer/article/2164581
版权声明: 本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!