三種函數格式
1,函數字面值
1.1,Lambda
1.2,匿名函數
2,反射引用普通函數
3,實現函數類型接口的類
首先定義一個需要函數作爲參數的函數
fun myFunIns(data:Int, myFun:(arg:Int)->Int):Int{
return myFun(data)
}
注意其中定義的函數類型是 (arg:Int)->Int ,也即參數是一個Int,返回一個Int
這是第一種格式,即函數字面值的Lambda表示法
var result1 = myFunIns(123, {
it * 2
})
上面利用 it 做了簡化。也可以將 lambda 抽取出來,此刻無法使用 it 簡化:
var result1 = myFunIns(123, {
data ->
data * 2
})
第二種格式,是函數字面值的匿名函數
var result2 = myFunIns(123, fun(data:Int):Int{
return data * 3
})
同樣,匿名函數可以抽取出來
val result2_fun = fun(data:Int):Int{ //We can extract it out
return data * 3
}
第三種是反射引用格式
fun myFun(data:Int):Int{
return data * 4
}
val result3 = myFunIns(123, ::myFun)
第四種是偶然看到的,通過一個類實現一個接口,該接口有一個函數。
class MyFun:(Int)->Int{
override operator fun invoke(data:Int):Int{
return data * 5
}
}
val result4 = myFunIns(123, MyFun())
比較繞,尚不知何種情況使用
實踐代碼:https://gist.github.com/maxyou/6527b0f2019704ce7ae257d5cb17791b