Kotlin笔记之高阶函数

高阶函数

定义

高阶函数就是以另一个函数作为参数或者返回值的函数。任何以lambda 或者函数引用作为参数的函数,或者返回值为lambda或者函数引用的函数,或者两者都满足的函数都是高阶函数

函数类型

函数类型语法如下:
Kotlin笔记之高阶函数_第1张图片
声明函数类型,需要将函数参数类型放在括号中,紧接着是一个箭头和函数的返回类型

例子如下:

// 有两个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()))

你可能感兴趣的:(Kotlin语言)