高阶函数 是接受其他函数作为参数或返回它们的函数。Kotlin使用Lambda表达式来方便地将行为作为值传递。
fun operateOnNumbers(a: Int, b: Int, operation: (Int, Int) -> Int): Int { return operation(a, b) } val sum = operateOnNumbers(3, 2) { x, y -> x + y } // sum = 5
fun multiply(x: Int, y: Int) = x * y operateOnNumbers(2, 3, ::multiply)
fun makeMultiplier(factor: Int): (Int) -> Int = { x -> x * factor } val triple = makeMultiplier(3) val result = triple(10) // 30
it)。
(Int, Int) -> Int函数类型声明与Function2<Int, Int, Int>使用之间有什么区别?
答复: 语法(Int, Int) -> Int只是Function2<Int, Int, Int>接口的更“优雅”的声明(语法糖)。在实践中,两者完全可以互换使用。
val f1: (Int, Int) -> Int = { x, y -> x + y } val f2: Function2<Int, Int, Int> = { x, y -> x + y }
但通常首选第一种,因为可读性更好。
故事
在一个大型事件处理系统中,在循环内创建了数十个Lambda表达式,而未使用内联函数。这导致了GC的高负载和性能下降,因为每次调用都会创建一个单独的匿名函数对象。
故事
尝试从另一个函数返回函数时,返回函数的签名没有正确定义,导致编译错误及长时间寻找原因。错误在于类型缺少括号:
fun foo(): Int -> Int而不是正确的fun foo(): (Int) -> Int。
故事
开发人员试图使用不明确类型的Lambda作为另一函数的参数,导致错误“无法推断此参数的类型”。问题通过明确指定Lambda或函数参数的类型得到解决。