1. 基础
1.1 lambada
lambada是一个定义即使用的函数。在kotlin中,函数是一种普通的数据类型,如果函数类型作为另一个函数的参数,则称这个函数为高阶函数。如果一个lambada是一个普通函数中的最后一个参数,那么它可以写在参数括号的外面。
现在定义一个参数为String返回值为Int的lambada如下:
var lambada = { i:String ->
println("lambada calling")
1
}
它的类型是
(kotlin.String) -> kotlin.Int
箭头左边的是参数,不可以有小括号,多个参数用逗号分隔;箭头右边的是方法体;方法体的最后一行是返回值。
可以看到在上面的例子中,参数是没有用到的,因此可以简写成下面的形式:
var lambada = { ->
println("lambada calling")
1
}
进一步的,箭头也可以省略,顺便去掉打印那一行:
var lambada = {1}
这便是一个无参的,永远返回1的lambada,它的类型如下:
() -> kotlin.Int
现在,吧返回值“1”也去掉,表达式"{}"依然是一个lambada函数(而不是一个数组),它的类型是:
() -> kotlin.Unit
当一个函数没有返回值的时候,我们用Unit来表示这个特征,而不是null,大多数时候我们不需要显示地返回Unit,或者生命一个函数的返回值是Unit,编译器会推断它。
2. 举例:列表过滤
Kotlin中的list支持过滤,该函数定义如下
/**
* Returns a list containing only elements matching the given [predicate].
*
* @sample samples.collections.Collections.Filtering.filter
*/
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
return filterTo(ArrayList<T>(), predicate)
}
可以这样调用:
val newList = list.filter { i:Int ->
i%2 != 0
}
可以把filter抽出一个变量这样更加灵活,如下:
var oddFilter = {i:Int ->
i%2 != 0
}
var bigNumberFilter = {i:Int ->
i > 5
}
在使用时,可以直接将函数作为变量传入,也可以在filter的lambada表达式中调用它:
var newList = list.filter { oddFilter(it) }
var newList = list.filter(oddFilter)