Kotlin 中的函数比 Java 中的方法更灵活,用途更广,功能更强。

完整的定义方式是:

[访问控制符] [修饰符] fun [<泛型标识符>] [扩展接收类型.]函数名([参数列表])[: 返回值类型]{
  函数体}

共 9 部分:

  1. [访问控制符]:可省略。

    Kotlin 中的访问控制符有四个:public 、protected 、internal 、private,如果没有声明,则默认为 public。这些访问控制符之后会详细讲。

  2. [修饰符]:可省略。

    这些修饰符会给函数添加不同的功能,包括 infix 和 inline,之后会详细讲。

  3. fun:不可省略。

    这是用来声明函数的关键字,是英语 Function(函数)的缩写。

  4. 函数名:不可省略。

    与 Java 方法名一样,遵循骆峰式的命名法。

  5. [<泛型标识符>]:可省略。

    与 Java 类似,如果返回值包含泛型,则需要在这里将函数标记为泛型函数。

    //定义一个函数,输入一个元素,输出一个只包含这个元素的 Listfun <T> singletonList(item: T): List<T> = listOf(item)
  6. [扩展接收类型.]:可省略。

    定义扩展函数时使用,后面会详解

  7. [参数列表]:可省略。

    每个参数都使用“形参名: 形参类型”的形式,这里的形参类型是不能省略的。更多特性见下面的详解。

  8. [: 返回值类型]:可省略。

    返回值类型可以是 Kotlin 和 Java 中的引用数据类型。

    如果一个函数没有返回值,则它的返回值类型是 Unit,一般会省略。

    //这里的 :Unit 一般省略fun sayHello(name: String): Unit = println("My name is ${name}.")

    如果返回值类型可以由单句的函数体推断出来,则可以省略返回值类型。

    //推断出返回值类型是 Double,可以省略 :Double 声明fun multiply(a: Double, b: Double) = a * b
  9. {函数体}:不可省略。

    函数体定义函数的行为,如果函数体只有一句,可以写成“= 函数体”的形式(这时就像定义一个变量了)。

    //简短的写法:fun add(a: Int, b: Int) = a + b//完整的写法:fun add(a: Int, b: Int): Int {return a + b}
参数列表详解:
  1. 默认参数。

    Kotlin 中的函数可以声明一个参数的默认值,在没有对应值输入时自动取默认值,大大减少了方法重载。

    //输入两个或三个 Int 变量,返回它们的和fun add(a: Int, b: Int, c: Int = 0) = a + b + cprintln(add(3, 1)) //默认 c 为 0,输出 4println(add(3, 1, 2)) //输入 c 值,不使用默认值,输出 6
  2. 可变数量参数。

    使用 vararg 修饰参数列表的最后一项,表示这个参数的数量是可变的,与 Java 中的“形参类型.. 形参名”相同。

    注意:标记为 vararg 的参数,在函数内表现为对应类型的数组。

    //输入最少两个 Int 类型变量,返回它们的和fun add(a: Int, b: Int, vararg n: Int): {
        var sum = a + b
     // n 是 IntArray 类型,i 自动推断为 Int 类型,使用 in 遍历 n 中的元素
        for (i in n) {
          sum += i
        }
        return sum}

Kotlin