函数类型

函数

Kotlin 中的函数使用fun关键字声明,函数名称的命名规则与变量一致:

fun double(x: Int): Int {
    return 2 * x
}

函数作为类型的表示

Kotlin 的函数类型是一种特殊的类型,它可以描述函数的类型信息,包括函数的参数和返回值类型。在 Kotlin 中,函数类型是以 (参数类型) -> 返回值类型 的形式来表示的。

例如,一个函数类型为 (Int, String) -> Boolean 的函数类型表示接收两个参数,一个为 Int 类型,一个为 String 类型,返回一个 Boolean 类型的值。

在 Kotlin 中,函数类型可以用作变量类型、参数类型、返回值类型、以及类型别名等。这使得函数可以像普通变量一样被传递、赋值、以及作为函数的参数和返回值使用。这种特性在函数式编程中非常重要。

同时,Kotlin 还提供了一种特殊的函数类型 () -> Unit,它表示不接收任何参数,也不返回任何值的函数类型,类似于 Java 中的 void 类型。

函数的参数

函数参数使用 Pascal 表示法定义,即 name: type。参数用逗号隔开。 每个参数必须有显式类型:

  1. 有参函数定义:

    fun powerOf(number: Int, exponent: Int): Int { /*……*/ }
  2. 无参函数定义:

    fun powerOf(): Int { /*……*/ }
  3. 参数可以添加默认值:

    fun read(
        b: Array<Byte>, 
        off: Int = 0, 
        len: Int = b.size,
    ) { /*……*/ }
  4. 如果从基类中覆盖一个有参的并且填写了默认值的方法,那么子类在覆盖此方法时的定义,必须从签名中省略默认参数值;也就是说,覆盖方法会沿用被覆盖方法的参数默认值:

    open class A {
        open fun foo(i: Int = 10) { /*……*/ }
    }
    
    class B : A() {
        override fun foo(i: Int) { /*……*/ }  // 不能有默认值
    }
  5. 可变参数

    fun <T> asList(vararg ts: T): List<T> {
        val result = ArrayList<T>()
        for (t in ts) // ts is an Array
            result.add(t)
        return result
    }
    
    asList(1, 2, 3)
    // 或者使用伸展操作符,将数组展开
    val a = arrayOf(1, 2, 3)
    val list = asList(-1, 0, *a, 4)

函数的返回值

  1. 无返回值函数

  2. 单返回值函数

  3. 多返回值函数

函数的调用

  1. 正常通过类型匹配调用

  2. 函数参数中,如果每个参数都有默认值,那么可以省略函数参数,或者省略部分函数参数

  3. 如果函数中有默认值的参数在无默认参数之后,这时候又不想传入默认值参数,就必须使用具名参数

  4. 同样的,如果所有没有默认值的参数都在前面,那么有默认值的参数都可以省略:

函数的调用,在没有具名参数的情况下,优先使用函数类型匹配函数。

局部函数

Kotlin 支持局部函数,即一个函数在另一个函数内部,局部函数可以访问外部函数(即闭包)的局部变量:

匿名函数

闭包

returnFun返回了一个函数,这个函数没有入参,返回值是Int。可以用变量接收它,还可以调用它。function和function2分别是创建的两个函数实例。 可以看到,每调用一次function(),count都会加一,说明count 被function持有了而且可以被修改。而function2和function的count是独立的,不是共享的。

最后更新于

这有帮助吗?