高阶函数
定义
高阶函数就是以另一个函数作为参数或者返回值的函数。任何以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()))