Kotlin 中的函数比 Java 中的方法更灵活,用途更广,功能更强。java
完整的定义方式是:数组
[访问控制符] [修饰符] fun [<泛型标识符>] [扩展接收类型.]函数名([参数列表])[: 返回值类型]{ 函数体}
共 9 部分:ide
[访问控制符]:可省略。函数
Kotlin 中的访问控制符有四个:public 、protected 、internal 、private,若是没有声明,则默认为 public。这些访问控制符以后会详细讲。spa
[修饰符]:可省略。ip
这些修饰符会给函数添加不一样的功能,包括 infix 和 inline,以后会详细讲。ci
fun:不可省略。it
这是用来声明函数的关键字,是英语 Function(函数)的缩写。io
函数名:不可省略。console
与 Java 方法名同样,遵循骆峰式的命名法。
[<泛型标识符>]:可省略。
与 Java 相似,若是返回值包含泛型,则须要在这里将函数标记为泛型函数。
//定义一个函数,输入一个元素,输出一个只包含这个元素的 Listfun <T> singletonList(item: T): List<T> = listOf(item)
[扩展接收类型.]:可省略。
定义扩展函数时使用,后面会详解
[参数列表]:可省略。
每一个参数都使用“形参名: 形参类型”的形式,这里的形参类型是不能省略的。更多特性见下面的详解。
[: 返回值类型]:可省略。
返回值类型能够是 Kotlin 和 Java 中的引用数据类型。
若是一个函数没有返回值,则它的返回值类型是 Unit,通常会省略。
//这里的 :Unit 通常省略fun sayHello(name: String): Unit = println("My name is ${name}.")
若是返回值类型能够由单句的函数体推断出来,则能够省略返回值类型。
//推断出返回值类型是 Double,能够省略 :Double 声明fun multiply(a: Double, b: Double) = a * b
{函数体}:不可省略。
函数体定义函数的行为,若是函数体只有一句,能够写成“= 函数体”的形式(这时就像定义一个变量了)。
//简短的写法:fun add(a: Int, b: Int) = a + b//完整的写法:fun add(a: Int, b: Int): Int {return a + b}
默认参数。
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
可变数量参数。
使用 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