天天看點

Kotlin學習筆記(四)—— 函數

函數的定義

定義一個函數由關鍵詞fun、函數名、參數清單,傳回值類型和函數體組成。fun是function的意思;函數名可以是任何符合命名規範的詞;參數清單由0個或多個組成;形參在前,類型在後,用冒号(:)隔開;傳回值類型緊接在函數清單括号後面,也是用冒号将函數清單和傳回值類型隔開,無傳回值預設是傳回Unit,也可以省略不寫;函數體是傳回值類型右邊一對大括号之前的代碼塊。

fun funDemo(a: Int, b: Int): Int {
    return a + b
}

或者簡寫成

fun funDemo(a: Int,b: Int) = a + b
           

可變長參數

vararg 修飾符可以接收多個參數,和Java中定義可變長參數用…(int…)一樣的。

// Java
private int add(int... numbers) {
	int sum = 0;
    for(int number:bumbers){
        sum += number;
    }
    return sum;
}

>> Log.d("TAG", add(1, 2, 3, 4))
10

// Kotlin
fun add(vararg numbers: Int) {
    var sum = 0
    for (number in numbers) {
        sum += number
    }
    return sum
}

>> println(add(1, 2, 3, 4))
10

或者

val arr = intArrayOf(1, 2, 3, 4)
>> println(add(*arr))
10
           

當傳入數組時,數組名前面需要加一個星号(*),星号是展開操作符,表示把這個數組全部展開。

成員函數

定義在類、object或者接口内的函數稱為成員函數。

class Rect {
    fun getArea(width: Int, height: Int): Int {
        return width * height
    }
}
           

getArea()就是一個成員函數

本地函數/嵌套函數

本地函數也叫嵌套函數,是指在函數裡面聲明的函數。嵌套函數的作用域隻在其外部函數内,在其外部就失去了作用。

fun printPrice(price: Int, number: Int) {
    fun totalPrice(): Int {
        return price * number
    }

    print(totalPrice())
}
           

以上代碼隻是一個非常簡單的例子。在外部方法中有很多相同的代碼也是可以抽取出來封裝成嵌套函數。

命名參數和預設參數

當調用一個函數參數很多時,很可能就無法知道參數的具體含義是什麼了,可讀性就比較差了。好在IDE會很智能的提示各個參數的含義。而且Kotlin也支援顯示的将參數名寫出來,一旦寫了命名參數後,參數的順序就不重要了。

fun getVolume(length: Int, width: Int, height: Int): Int {
    return length * width * height
}

>> getVolume(10, 20 ,30)
>> getVolume(length = 10, width = 20, height = 30)
>> getVolume(width = 20, length = 10, height = 30)
           

以上三種調用方法完全等價。

但是如果參數 height 預設為 30 呢?難道每次調用都需要再傳一次30嗎?這感覺很多餘。這種情況可以給函數指定預設參數值。

fun getVolume(length: Int, width: Int, height: Int = 30): Int {
    return length * width * height
}

>> getVolume(10, 20 ,30)
>> getVolume(10, 20)
>> getVolume(length = 10, width = 20, height = 30)
>> getVolume(width = 20, length = 10, height = 40)
           

函數操作符

重載操作符必須要用 operator 關鍵字以及用對應的英文名作為函數名。

操作 函數名
!x x.not()
-y y.unaryMinus()
+z z.unaryPlus()
a…b a.rangeTo(b)
c + d c.plus(d)
e - f e.minus(f)
g * h g.times(h)
i/j i.div(j)
m%n m.mod(n)

in 和 contains

in 用在周遊和判斷包含關系時候使用。in 關鍵字對應的函數名是 contains。

val arr = arrayOf(1, 2, 3, 4)
val a = 1 in arr
val b = arr.contains(1)
>> println(a)
>> println(b)

true
true
           

set 和 get

set 對應數組設定值,get對應數組取值[]

val arr = arrayOf(1, 2, 3, 4, 5)

>> println(arr[1])
2

>> println(arr.get(1))
2

>> arr[1] = 10
>> println(arr.joinToString())
1, 10, 2, 3, 4, 5

>> arr.set(1, 10)
>> println(arr.joinToString())
1, 10, 2, 3, 4, 5
           

擴充函數

給已有的類加入新的函數而又不修改原有的類。比如給 Int 類增加一個對一個數求平方加 1 的函數。

fun Int.squarePlusOne(): Int {
    return this * this +1
}

>> println(10.squarePlusOne())
101