美文网首页
Kotlin基础认识 (10)函数

Kotlin基础认识 (10)函数

作者: 狼性代码人 | 来源:发表于2019-05-24 15:49 被阅读0次
一、函数声明
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
}

相关文章

网友评论

      本文标题:Kotlin基础认识 (10)函数

      本文链接:https://www.haomeiwen.com/subject/racgzqtx.html