跟上一篇一样,本文的目的是记录自己的学习过程,以免“日后”忘了自己看过什么。在了解Lambdas表达式之前,我们需要先了解另外一个叫高阶函数的东西。
高阶函数,名字看起来挺能唬人的,其实就是把函数作为参数的函数,看看栗子就明白了:
fun hehe(action: () -> Int) :Int{
return action()
}
///////调试///////////
fun main(args: Array<String>) {
println(hehe{ 2*3})
}
///////输出///////////
6
可以看到,hehe()是一个函数,hehe()中的参数是另一个函数,这个函数的名叫action,action是一个无参且返回类型为Int的函数,这就是一个简单的高阶函数。
上面的栗子中,hehe{2*3}就是一个Lambdas表达式,先来看看Lambdas表达式的定义:
1. A lambda expression is always surrounded by curly braces,
2. Its parameters (if any) are declared before -> (parameter types may be omitted),
3. The body goes after -> (when present).
/////////////翻译过来//////////
1.一个Lambdas表达式是被{}所包围的语句块
2.Lambdas表达式的参数是在 ->前面声明的(参数的类型可以被省略)
3.Lambdas表达式的代码块(函数的具体实现)是放在 ->后面的
再来看一个牛逼(复杂)点的Lambdas表达式(map函数):
fun <T, R> List<T>.map(transform: (T) -> R): List<R> {
val result = arrayListOf<R>()
for (item in this)
result.add(transform(item))
return result
}
//////////调试/////////////
val ints = arrayListOf<Int>
val doubled = ints.map { it -> it * 2 }
//it可以代替表示List中的元素
map函数作用于List,它的参数是泛型T,它返回一个泛型R。map的作用是将一个参数泛型为T的List转换为一个参数泛型为R的List,在map的实现代码块中,先声明一个参数泛型为R的List(这个List是最终作为返回结果的List),然后在for循环里面,迭代this (this即为调用map方法的List) ,通过transform将参数泛型为T的List转换为参数泛型为R的List。
其实Lambdas表达式就是一个匿名的函数(可以类比Java中的匿名类)