Android开发Android进阶Android开发

Kotlin函数的形参

2019-07-10  本文已影响9人  程序员丶星霖

一、命名参数

Kotlin函数的参数名不是无意义的,Kotlin允许调用函数时通过名字来传入参数值。

fun main(args: Array<String>) {
    println(girth(3.5, 4.8))
    println(girth(width = 3.5, height = 4.8))
    println(girth(height = 4.8, width = 3.5))
    println(girth(3.5, height = 4.8))
}

fun girth(width: Double, height: Double): Double {
    println("width:${width}")
    println("height:${height}")
    return 2 * (width + height)
}

输出结果:

width:3.5
height:4.8
16.6

width:3.5
height:4.8
16.6

width:3.5
height:4.8
16.6

width:3.5
height:4.8
16.6

如果希望调用函数时混合使用命名参数和位置参数,那么命名参数必须位于位置参数之后。

二、形参默认值

在某些情况下,程序需要在定义函数时为一个或多个形参指定默认值。

fun main(args: Array<String>) {
    sayHi()
    sayHi("关羽")
    sayHi("关羽", "温酒斩华雄")
    sayHi(message = "温酒斩华雄")
}

fun sayHi(name: String = "刘备", message: String = "桃园三结义") {
    println("${name},您好")
    println("咱们${message}")
}

输出结果:

刘备,您好
咱们桃园三结义

关羽,您好
咱们桃园三结义

关羽,您好
咱们温酒斩华雄

刘备,您好
咱们温酒斩华雄
fun main(args: Array<String>) {
    printTriangle(6, '@')
    printTriangle(7, char = '#')
    printTriangle(char = '*')
}

//定义一个打印三角形的函数
fun printTriangle(height: Int = 5, char: Char) {
    for (i in 1..height) {
        //先打印一排空格
        for (j in 0 until height - 1) {
            print(" ")
        }
        //在打印一排特殊字符
        for (j in 0 until 2 * i - 1) {
            print(char)
        }
    }
}

输出结果:

     @
     @@@
     @@@@@
     @@@@@@@
     @@@@@@@@@
     @@@@@@@@@@@
      #
      ###
      #####
      #######
      #########
      ###########
      #############
    *
    ***
    *****
    *******
    *********

如果将带默认值的参数定义在无默认值的参数之前,如果要为默认参数使用默认值时,只能使用命名参数为无默认值的参数传入参数值。

出于对这种情况的考虑,Kotlin建议将带默认值的参数放在函数形参列表的后面

三、尾递归函数

Kotlin支持一种尾递归函数的编程方式,当函数将调用自身作为它执行的最后一行代码,且递归调用后没有更多代码时,可使用尾递归语法。

尾递归不能在异常处理的try、catch、finally块中使用。

尾递归函数需要使用tailrec修饰。

fun main(args: Array<String>) {
    println(fact(10))
    println(factRec(10))
}

//定义计算阶乘的函数
fun fact(n: Int): Int {
    if (n == 1) {
        return 1
    } else {
        return n * fact(n - 1)
    }
}

//使用尾递归函数的语法
tailrec fun factRec(n: Int, total: Int = 1): Int =
    if (n == 1) total else factRec(n - 1, total * n)

输出结果:

3628800
3628800

四、个数可变的形参

Kotlin允许定义个数可变的参数,从而允许为函数指定数量不确定的形参。

在定义函数时,在形参的类型前添加vararg修饰,则表明该形参可以接受多个参数值,多个参数值被当成数组传入。

fun main(args: Array<String>) {
    test(5, "Python", "Java", "Kotlin")
}

//定义形参个数可变的函数
fun test(a: Int, vararg languages: String) {
    for (language in languages) {
        println(language)
    }
    println(a)
}

输出结果:

Python
Java
Kotlin
5

Kotlin允许个数可变的形参可以处于形参列表的任意位置,但是Kotlin要求一个函数最多只能带一个个数可变的形参。

fun main(args: Array<String>) {
    test("Python", "Java", "Kotlin", a = 6)
}

//定义形参个数可变的函数
fun test(vararg languages: String, a: Int) {
    for (i in languages.indices) {
        println(languages[i])
    }
    println(a)
}

输出结果:

Python
Java
Kotlin
6

由于可数可变的形参可以接受个数不等的参数值,所以,如果需要给后面的参数传入参数值,则必须使用命名参数。

如果将数组的多个元素传给个数可变的参数,则可以在传入数组参数前添加*运算符。

fun main(args: Array<String>) {
    var arr = arrayOf("Python", "Java", "Kotlin")
    test(*arr, a = 6)
}

//定义形参个数可变的函数
fun test(vararg languages: String, a: Int) {
    for (i in languages.indices) {
        println(languages[i])
    }
    println(a)
}

输出结果:

Python
Java
Kotlin
6

学海无涯苦作舟

我的微信公众号.jpg
上一篇 下一篇

猜你喜欢

热点阅读