一、概述
在JS,C 等语言中函数式的编程是很常见的,函数作为参数传递,在目标函数中再调用。很灵活简洁的编程方式。
Java不能直接用函数作为形参,只能传递对象的引用,所以在需要回调函数时,往往传递的是接口的匿名实现。
二、高阶函数 示例
高阶函数:以另一个函数作为参数,或者返回值是函数 称为 高阶函数
需要补充一些lambda的语法糖
函数作为参数:回调函数的作用,类比接口
返回值是函数: 参考多态作用
2.1、不带参数的函数 作为形参
fun main(args: Array<String>) {
//lambda 闭包写在函数体外部, 形参中的最后一个形参是函数参数 可以这么写
action(2){
println("函数 回调 -- 第1种传递写法")
}
//lambda 闭包作为形参
action(1,{
println("函数 回调 -- 第2种传递写法")
})
//一步步的 显示调用方式
var method:()->Unit = {
println("函数 回调 -- 第3种传递写法")
}
action(3, method)
}
/**
* 函数作为 形参
*/
fun action(first:Int, callback:()->Unit){
//调用
callback()
}
2.2、带参数和返回值得函数 作为形参
fun main(args: Array<String>) {
action(1){it-> //Lambda语法,回调参数在这里
println("回调函数参数= : $it")
true//Lambda语法,最后一行返回值就是闭包的返回值
}
}
/**
* 函数作为 形参
*/
fun action(first:Int, callback:(Int)->Boolean){
//调用
if(callback(1)){
println("回调函数返回值 true")
}else{
println("回调函数返回值 false")
}
}
2.3、高级函数 返回一个函数
函数作为返回值,没有函数作为参数,用的场景广。可以用在一些状态判断跟的子逻辑,有多态的作用。可以指向一些不同的逻辑
fun main(args: Array<String>) {
var method: (Int, Int) -> Int
method = action()
println(method.invoke(1, 2))
method = action2()
println(method.invoke(1, 2))
}
/**
* 函数作为 形参
*/
fun action(): (Int, Int) -> Int {
//逻辑代码
return { j, i ->
j + i
}
}
fun action2(): (Int, Int) -> Int {
//逻辑代码
return { j, i ->
j - i
}
}