一、函数声明
fun 函数名(参数列表): 返回值类型 {
函数体
return 返回值
}
在kotlin中声明函数时,关键字是 fun,函数名需要符合标识符命名规范:多个参数列表之间可以用逗号 (,) 分隔,当然也可以没有参数。
fun rectangleArea(width: Double, height: Double): Double {
val area = width * height
return area
}
二、返回特殊数据
-
无返回数据 与 Unit 类型
有的函数只是为了处理某个过程,不需要返回具体数据,例如println
函数。此时可以将函数返回类型声明为Unit
,相当于 java 中的 void 类型,即表示没有实际意义的数据。
fun rectangleArea1(width: Double, height: Double): Unit { // 可以省略 Unit
val area = width * height
println("$width * $height 长方形的面积:$area")
return // 可以忽略 return
}
fun rectangleArea2(width: Double, height: Double) { // 省略 Unit
val area = width * height
println("$width * $height 长方形的面积:$area")
// 省略 return
}
-
永远不会正常返回数据 与 Nothing 类型
kotlin中提供了一种特殊的数据类型 Nothing,Nothing 只用于函数返回类型声明,不能用于变量声明。Nothing 声明的函数永远不会正常返回,只会抛出异常。
import java.io.IOException
fun main(args: Array<String>) {
val date = readDate()
}
fun readDate(): Nothing {
throw IOException()
}
三、函数参数
-
使用命名参数调用函数
在调用函数时,一旦其中一个参数采用了命名参数形式传递,那么其后的所有参数都必须采用命名参数形式传递,除非它是最后一个参数。代码 1️⃣的函数调用中,第一个参数width
采用了命名参数形式,而它后面的参数没有采用命名参数形式,因此会有编译错误。
fun printArea(width: Double, height: Double) {
val area = width * height
println("$width * $height 长方形的面积:$area")
}
fun main(args: Array<String>) {
printArea(320.0, 480.0) // 没有采用命名参数函数使用
printArea(width = 320.0, height = 480.0) // 采用命名参数函数调用
printArea(320.0, height = 480.0) // 采用命名参数函数调用
// printArea(width = 320.0, 480.0) // 编译错误 1️⃣
printArea(height = 480.0, width = 320.0) // 采用命名参数函数调用
}
-
参数默认值
在声明函数时可以为参数设置一个默认值,当调用函数的时候可以忽略该参数。即如果调用者没有传递参数,则使用默认值。
fun makeCoffee(type: String = "卡布奇诺"): String {
return "制作一杯${type}咖啡。"
}
fun main(args: Array<String>) {
val coffee1 = makeCoffee("拿铁")
val coffee2 = makeCoffee()
println(coffee1) // 制作一杯拿铁咖啡。
println(coffee2) // 制作一杯卡布奇诺咖啡。
}
-
可变参数
kotlin中函数的参数个数可以变化,它可以接受不确定数量的输入类型参数(这些参数具有相同的类型),有点像是传递一个数组。可以通过在参数名前面加vararg
关键字的方式来表示这是可变参数。
fun sum(vararg numbers: Double, multiple: Int = 1): Double {
var total = 0.0
for (number in numbers) {
total += number
}
return total * multiple
}
fun main(args: Array<String>) {
println(sum(100.0, 20.0, 30.0)) // 输出 150.0
println(sum(30.0, 80.0)) // 输出 110.0
println(sum(30.0, 80.0, multiple = 2)) // 输出 220.0 1️⃣
val doubleAry = doubleArrayOf(50.0, 60.0, 10.0)
println(sum(30.0, 80.0, *doubleAry)) // 输出 230.0
}
注意: 可变参数不是最后一个参数时,后面的参数需要采用命名参数形式传递。代码第1️⃣行 “30.0,80.0”是可变参数,后面 multiple 参数需要用命名参数形式传递。
四、表达式函数体
如果在函数体中表达式能够表示成单个表达式时,那么函数可以采用更加简单的表示方式。
fun rectangleArea(width: Double, height: Double): Double {
val area = width * height
return area
}
fun rectangleArea(width: Double, height: Double) = width * height
五、局部函数
本文之前声明的函数都是顶层函数,函数还可以声明在类内部和另一个函数的内部,在类内部声明的函数称为成员函数,在另一个函数内部声明的函数称为局部函数。另外,内部函数的作用域在外函数体内。
fun calculate(n1: Int, n2: Int, opt: Char): Int {
val multiple = 2
// 声明相加函数
fun add(a: Int, b: Int): Int {
return (a + b) * multiple
}
// 声明相减函数
fun sub(a: Int, b: Int): Int = (a - b) * multiple
return if (opt == '+') add(n1, n2) else sub(n1, n2)
}
fun main(args: Array<String>) {
println(calculate(10, 5, '+')) // 输出结果是 30
add(10, 5) // 编译错误
sub(10, 5) // 编译错误
}
六、匿名函数
kotlin中可以使用匿名函数,匿名函数不需要函数名,需要 fun 关键字声明,还需要有参数列表和返回类型声明,函数体中需要包含必要的return语句。
fun calculate(n1: Int, n2: Int, opt: Char): Int {
val multiple = 2
val resultFun = if (opt == '+') {
// 声明相加匿名函数
fun(a: Int, b: Int): Int {
return (a + b) * multiple
}
} else
fun(a: Int, b: Int): Int = (a - b) * multiple
return resultFun(n1, n2)
}
fun main(args: Array<String>) {
println(calculate(10, 5, '+')) // 输出结果是 30
}
网友评论