函數的定義
定義一個函數由關鍵詞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