Kotlin函數可變參數


Java中可變參數規則:

  • 可變參數前面可以有其他參數,但是可變參數只能出現在參數列表的最后
  • 用...代表可變參數,...位於變量類型和變量名之間
  • 調用含有可變參數的方法時,編譯器為該可變參數隱式創建一個數組,在方法體中以數組的形式訪問可變參數

先來看看Java中的剩余參數是咋用的

public class TestVariableParemeters {

    public static void main(String[] args) {
        new TestVariableParemeters().addNumbers("liuliqianxiao", 1, 2, 3, 4, 5);
    }

    public int addNumbers(String name, int... args) {
        int result = 0;
        for (int i = 0; i < args.length; i++) {
            result += args[i];
        }
        return result;
    }

}

Kotlin中可變參數規則:

  • 可變參數不必是函數的參數列表中的最后一個
  • 用vararg paramName: paramType格式申明一個可變參數
  • 和Java一樣,在函數體內部,可以以數組的形式使用這個可變參數的形參變量

先來看看我們用Kotlin重寫上面的addNumbers方法

fun main(args: Array<String>) {
    User().addNumbers("liuliqianxiao",1, 2, 3, 4, 5)
}

class User{
    fun addNumbers(name: String, vararg args: Int): Int {
        var result = 0
//        for (i in args.indices) {
//            result += args[i]
//        }
        for(it in args){
            result += it
        }
        return result
    }
}

不得不說idea真是非常智能,我將上述Java版的addNumbers方法直接拷貝粘貼到Kotlin文件中,立馬提示我是否要轉換成Kotlin代碼,點確定就能生成Kotlin版本的addNumbers方法了。

注釋掉的for循環就是自動生成的,但是我不想用它生成的那個版本,所以自己改寫了for循環,但是結果都是正確的。

上述規則中說了,可變參數不必是參數里列表中的最后一個,來看看這種情況,函數怎么調用:

fun main(args: Array<String>) {
    //調用的時候,給id賦值必須用命名參數形式
    println(User().addNumbers("liuliqianxiao",1, 2, 3, 4, 5, id = 12345))
}

class User{
    //相對於上面加了最后一個固定參數id
    fun addNumbers(name: String, vararg args: Int, id: Int): Int {
        var result = 0
//        for (i in args.indices) {
//            result += args[i]
//        }
        for(it in args){
            result += it
        }
        return result
    }
}

再來看一個接受多種類型參數的可變參數,只需將類型設成Any即可

fun main(args: Array<String>) {
    test(1,"Hello,Kotlin!",'a',User(1,"liuliqianxiao"))
}

//用Any代表任意類型
fun test(vararg args: Any){
    for(it in args){
        println(it)
    }
}

class User(var id: Int,var name: String){
    override fun toString(): String {
        return "User(id=$id, name='$name')"
    }
}

//輸出結果
//1
//Hello,Kotlin!
//a
//User(id=1, name='liuliqianxiao')

 

關於Kotlin中可變參數就說到這里吧,說的不夠全面,想到哪里就說到哪里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM