Lambda表达式的标准语法:
{(形参列表)->
//零条到多条可执行语句
}
一、调用Lambda表达式
Lambda表达式的本质是功能更灵活的代码块,因此完全可以将Lambda表达式赋值给变量或直接调用Lambda表达式。
fun main(args: Array<String>) {
var square = { n: Int ->
n * n
}
//使用square调用Lambda表达式
println(square(5))
println(square(10))
var result = { base: Int, exponent: Int ->
var result = 1
for (i in 1..exponent) {
result *= base
}
result
}(4, 3)
println(result)
}
输出结果:
25
100
64
二、利用上下文推断类型
完整的Lambda表达式需要定义形参类型,但是如果Kotlin可以根据Lambda表达式上下文推断出形参类型,那么Lambda表达式就可以省略形参类型。
fun main(args: Array<String>) {
var square: (Int) -> Int = { n -> n * n }
//使用square调用Lambda表达式
println(square(5))
println(square(10))
var result = { base: Int, exponent: Int ->
var result = 1
for (i in 1..exponent) {
result *= base
}
result
}(4, 3)
println(result)
var list = listOf("Java", "Kotlin", "Go")
var rt = list.dropWhile { e -> e.length > 3 }
println(rt)
}
输出结果:
25
100
64
[Go]
三、省略形参名
Lambda表达式不仅可以省略形参类型,而且如果只有一个形参,那么Kotlin允许省略Lambda表达式的形参名。
如果Lambda表达式省略了形参名,那么此时->也不需要了,Lambda表达式可通过it来代表形参。
fun main(args: Array<String>) {
var square: (Int) -> Int = { n -> n * n }
//使用square调用Lambda表达式
println(square(5))
println(square(10))
var result = { base: Int, exponent: Int ->
var result = 1
for (i in 1..exponent) {
result *= base
}
result
}(4, 3)
println(result)
var list = listOf("Java", "Kotlin", "Go")
//省略形参名,用it代表形参
var rt = list.dropWhile { it.length > 3 }
println(rt)
}
输出结果:
25
100
64
[Go]
四、调用Lambda表达式的约定
如果函数的最后一个参数是函数类型,那么允许在圆括号之外指定Lambda表达式。
fun main(args: Array<String>) {
var list = listOf("Java", "Kotlin", "Go")
var rt = list.dropWhile { it.length > 3 }
println(rt)
var map = mutableMapOf("Android" to 1, "Kotlin" to 2)
list.associateTo(map) { "我要${it}" to it.length }
println(map)
var rtx = list.reduce() { acc, e -> acc + e }
println(rtx)
}
输出结果:
[Go]
{Android=1, Kotlin=2, 我要Java=4, 我要Kotlin=6, 我要Go=2}
JavaKotlinGo
五、个数可变的参数和Lambda参数
Kotlin约定:如果调用函数时最后一个参数是Lambda表达式,则可将Lambda表达式放在圆括号外面,这样就无须使用命名参数了。
因此,如果一个函数既包含个数可变的形参,也包含函数类型的形参,就应该将函数类型的形参放在最后。
fun main(args: Array<String>) {
var list1 = test("Java", "Kotlin", "Go") { it.length }
println(list1)
var list2 = test("Java", "Kotlin", "Go") { "我要学习${it}" }
println(list2)
}
fun <T> test(vararg names: String, transform: (String) -> T): List<T> {
var mutableList: MutableList<T> = mutableListOf()
for (name in names) {
mutableList.add(transform(name))
}
return mutableList.toList()
}
输出结果:
[4, 6, 2]
[我要学习Java, 我要学习Kotlin, 我要学习Go]
网友评论