Lambda表达式是现代编程语言争相引入的一种语法,Lambda表达式是功能更灵活的代码块,可以在程序中被传递和调用。
一、使用Lambda表达式代替局部函数
使用Lambda表达式简化之前的getMathFunc函数。
fun main(args: Array<String>) {
var mathFunc = getMathFunc("square")
println(mathFunc(5))
mathFunc = getMathFunc("cube")
println(mathFunc(5))
mathFunc = getMathFunc("other")
println(mathFunc(5))
}
fun getMathFunc(type: String): (Int) -> Int {
when (type) {
//调用局部函数
"square" -> return { n: Int ->
n * n
}
"cube" -> return { n: Int ->
n * n * n
}
else -> return { n: Int ->
var result = 1
for (index in 2..n) {
result *= index
}
result
}
}
}
输出结果:
25
125
120
使用Lambda表达式与局部函数存在如下区别:
- Lambda表达式总是被大括号括着。
- 定义Lambda表达式不需要fun关键字,无须指定函数名。
- 形参列表在->之前声明,参数类型可以省略。
- 函数体放在->之后。
- 函数的最后一个表达式自动被作为Lambda表达式的返回值,无须使用return关键字。
二、Lambda表达式的脱离
作为函数参数传入的Lambda表达式可以脱离函数独立使用。
import java.util.ArrayList
fun main(args: Array<String>) {
collectFn { it * it }
collectFn { it * it * it }
println(lambdaList.size)
for (i in lambdaList.indices) {
println(lambdaList[i](i + 10))
}
}
//定义一个List类型的变量,并将其初始化为空List
var lambdaList = ArrayList<(Int) -> Int>()
//定义一个函数,该函数的形参类型为函数
fun collectFn(fn: (Int) -> Int) {
lambdaList.add(fn)
}
输出结果:
2
100
1331
把Lambda表达式作为参数传给collectFn()函数之后,Lambda表达式可以脱离collectFn()函数使用。
网友评论