高階函數
定義
高階函數就是以另一個函數作爲參數或者返回值的函數。任何以lambda 或者函數引用作爲參數的函數,或者返回值爲lambda或者函數引用的函數,或者兩者都滿足的函數都是高階函數
函數類型
函數類型語法如下:
聲明函數類型,需要將函數參數類型放在括號中,緊接着是一個箭頭和函數的返回類型
例子如下:
// 有兩個Int型參數和Int型返回值的函數
val sum:(Int,Int) -> Int={x,y ->x+y}
// 沒有參數和返回值的函數
val action:()->Unit ={println(12)}
注意: 在聲明一個普通的函數時,Unit類型的返回值是可以省略的,但是一個函數類型聲明總是需要一個顯式的返回類型,所以在這種場景下Unit是不能省略的
函數類型的返回值爲可空 和 函數類型的可空變量情況
// 函數類型的返回值爲可空
var can :(Int,Int)-> Int?={null}
//函數類型的可空變量
var f:((Int,Int) -> Int)?=null
函數類型作爲參數
fun numResult(operation :(Int,Int)->Int){
// 調用函數類型的參數
val result=opration(2,3)
println("The result is $result")
}
>>>> numResult{a,b -> a + b}
The result is 5
函數類型作爲函數的返回類型
要返回一個函數,需要寫一個return表達式,跟上一個lambda、一個成員引用,或者其他的函數類型的表達式,比如一個(函數類型的)局部變量
data class Person(
val firstName :String,
val lastName :String,
val phoneName :String?
)
class ContactListFilters{
var prefix:String=""
var onlyWithPhoneNumber:Boolean =false
// 聲明一個返回函數的函數
fun getPredicate(): (Person) -> Boolean {
val startsWithPrefix={p : Person -> p.firstName.startWith(prefix) || p.lastName.startsWith(prefix)}
if(!onlyWithPhoneNumber){
// 返回一個函數類型的變量
return startsWithPrefix
}
// 返回一個lambda
return {startsWithPrefix(it) && it.phoneNumber !=null}
}
}
>>>>> val contacts=listof(Person("mike","Li","125"),Person("marry","Zhao",null))
val filters=ContactListFilters()
with(filters){
prefix="Li"
onlyWithPhoneNumber=true
}
println(contacts.filter(filters.getPredicate()))