Kotlin中的函数参数类型为Lambda表达式时的由繁化简
Lambda表达式的语法结构如下:
{ 参数名1:参数类型, 参数名2:参数类型 -> 函数体 }
首先我们来看下下面这段代码,在集合中找到最长的字符
val listOf = listOf("Apple", "Banana", "Orange")
val maxOf = listOf.maxOf { it.length }
println("maxOf $maxOf")
maxOf函数中,接收的参数其实是一个Lambda的参数,上面是最简化的步骤,那么它是怎么一步一步简化而来的呢?下面我来一一道来。上面的代码是由下面的代码简化而来的。
val listOf = listOf("Apple", "Banana", "Orange")
val lambda = { fruit: String -> fruit.length }
val maxOf = listOf.maxOf(lambda)
println("maxOf $maxOf")
我们将一个Lambda表达式放入了maxOf函数中。上面的这种比较啰嗦,简化的点非常多,让我们来一步一步的简化。
首先:我们不需要专门定义一个Lambda变量,而是可以直接将Lambda表达式传入maxOf函数当中,因此第一步简化后如下所示:
val listOf = listOf("Apple", "Banana", "Orange")
val maxOf = listOf.maxOf({ fruit: String -> fruit.length })
println("maxOf $maxOf")
然后Kotlin规定,当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号的最外面,如下所示:
val listOf = listOf("Apple", "Banana", "Orange")
val maxOf = listOf.maxOf() { fruit: String -> fruit.length }
println("maxOf $maxOf")
接下来,如果Lambda参数是函数的唯一一个参数的话,还可以将函数的括号省略:
val listOf = listOf("Apple", "Banana", "Orange")
val maxOf = listOf.maxOf { fruit: String -> fruit.length }
println("maxOf $maxOf")
由于Kotlin拥有出色的类型推导机制,Lambda表达式中的参数列表其实在大多数情况下不必声明参数类型,因此代码可以进一步简化成:
val listOf = listOf("Apple", "Banana", "Orange")
val maxOf = listOf.maxOf { fruit -> fruit.length }
println("maxOf $maxOf")
最后,当Lambda表达式的参数列表中只有一个参数时,也不必声明参数名,而是可以使用it关键字来代替,那么代码就变成了:
val listOf = listOf("Apple", "Banana", "Orange")
val maxOf = listOf.maxOf {it.length }
println("maxOf $maxOf")
大功告成!