kotlin-高阶函数

定义:一个用函数作为参数或者返回值的函数
如何定义:()->Unit 括号里面代表函数的参数,箭头后面代表函数的返回值。
传递一个函数,或要将这个函数赋值给一个变量的时候,需要在函数前面加双冒号。
这个双冒号的写法,叫函数引用Function Reference
加了两个冒号,这个函数才变成了一个对象。
在kotlin里 [ 函数可以作为参数 ] 这件事的本质是函数可以作为对象存在。
因为只有是对象才可以被作为参数传递。
kotlin中函数就是函数,不是对象。
kotlin选择创建一个和函数具有相同功能的对象(用双冒号)。
一个指向对象的引用。
这个对象不是函数本身,而是一个和这个函数具有相同功能的对象。
怎么相同?你可以怎么用这个函数,就可以怎么用它(加了双冒号的对象)。
只有函数类型的对象,才能调用invoke(在函数对象后面直接加括号是kotlin的语法糖)。
函数就是函数,它和对象是两个维度的东西。
双冒号表达的是它是一个指向对象的引用,而不是指向函数本身。
而是指向一个我们在代码中看不见的对象。
这个对象复制了原函数的功能。

fun a(params: (Int) -> String) {
    println("aaa")
}

fun b(int: Int): String {
    return "acb"
}

fun main() {
    a(::b)
    val c = ::b
    c.invoke(1)
    c(2)
}

除了用双冒号引用,还可以直接把函数挪过来写
这种写法叫匿名函数
注:d不是函数的名字,而是变量的名字,指向这个匿名函数类型的对象。

val d = fun(param: Int): String {
    return param.toString()
}

val z : (Int)->String = {
     it.toString()
}

val y: () -> Unit = {
    println("hahaha")
}

val w = {
    println("???")
}

如果Lambda是函数的最后一个参数,可以把lambda写在括号外面,
而如果lambda是函数唯一的参数,可以把参数省略,用it指代这个参数
lambda的返回值不是用return,而是取最后一行代码的值

kotlin的匿名函数其实不是函数,而是个对象,它和(::+函数名)是一个东西。
同理Lambda也是一个函数类型的对象。

你可能感兴趣的:(kotlin-高阶函数)