Lambda表达式虽然简洁、方便,但是它有个缺陷:Lambda表达式不能指定返回值类型。
大部分的时候,Kotlin可以推断出Lambda表达式的返回值类型。在一些特殊的场景下,Kotlin无法推断出Lambda表达式的返回值类型,需要显式指定返回值类型,匿名函数即可代替Lambda表达式。
一、匿名函数的用法
fun main(args: Array<String>) {
//定义匿名函数,赋值给test变量
var test = fun(x: Int, y: Int): Int {
return x + y
}
//通过test调用匿名函数
println(test(2, 4))
}
输出结果:
6
匿名函数与普通函数基本相似,只是将普通函数的函数名去掉而已。
如果系统可以推断出匿名函数的形参类型,那么匿名函数允许省略形参类型。
fun main(args: Array<String>) {
var filteredList = listOf(3, 5, 20, 100, -25).filter(
//使用匿名函数作为filter()方法的参数
fun(el): Boolean {
return Math.abs(el) > 20
})
println(filteredList)
}
输出结果:
[100, -25]
匿名函数的返回值类型的声明规则与普通函数相同:
如果使用普通代码块作为函数体,则匿名函数需要显式指定返回值类型,否则认为该匿名函数没有返回值;
如果使用单表达式作为函数体,则无需指定返回值类型,系统可以自动推断。
fun main(args: Array<String>) {
//定义匿名函数的函数体是单表达式,可以省略声明函数的返回值类型
var wawa = fun(x: Int, y: Int) = x + y
//通过wawa调用匿名函数
println(wawa(2, 4))
var rt = listOf(3, 5, 20, 100, -25).filter(
fun(el) = Math.abs(el) > 20
)
println(rt)
}
输出结果:
6
[100, -25]
二、匿名函数和Lambda表达式
匿名函数的本质依旧是函数,因此匿名函数的return则用于返回该函数本身。
而Lambda表达式的return用于返回它所在的函数,而不是返回Lambda表达式。
fun main(args: Array<String>) {
var list = listOf(3, 5, 30, -25, 14)
//使用匿名函数执行forEach()方法
list.forEach(fun(n) {
println("元素依次为:${n}")
//匿名函数中的return用于返回该函数本身
return
})
//使用Lambda表达式执行forEach()方法
list.forEach({n->
println("元素依次为:${n}")
//Lambda表达式中的return用于返回它所在的函数
return
})
}
输出结果:
元素依次为:3
元素依次为:5
元素依次为:30
元素依次为:-25
元素依次为:14
元素依次为:3
如果想在Lambda表达式中使用return,则可使用限定返回的语法。
list.forEach({n->
println("元素依次为:${n}")
//Lambda表达式中的return用于返回它所在的函数
return@forEach
})
上式即可正常遍历。
网友评论