Kotlin 對於 immutable 的支持,在 Collection 的是毫不掩示的。大家有想過為什麼是 listOf 與 mutableListOf 而不是 listOf 與 immutableListOf。這表示 Kotlin 更希望你先用不可變的集合。
就如 Kotlin 分開了可讀寫和唯讀的屬性,Kotlin 也分開了可讀寫和唯讀的集合 (Collection) 。這得益於集合階層的設計方式。下圖展示 Kotlin 中集合階層的關係。在左側,可以看到 Iterable、Collection、Set 和 List 介面,所有這些都是不可變的集合。這意味著它們沒有任何允許修改的方法。在右側,可以看到 MutableIterable、MutableCollection、MutableSet 和 MutableList 介面,所有這些都代表可變的集合。注意每個可變的介面都組合了相對應的 immutable 介面,並增加了允許修改(mutable)的方法
關於不可變的集合可以參考 Anjana Vakil 的說明,他的講解很生動又好懂 也可以當作前幾天 mutable 危險性的補充。
當處理一個不可變的列表時,你不能直接修改它。而是要透過 +(plus) -(minus) 操作來得到一個新增刪結果的新的列表
val list = listOf("apple", "banana")
val newList = list + "cherry"
println(newList) // [apple, banana, cherry]
val fruitsToAdd = listOf("grape", "kiwi")
val updatedList = list + fruitsToAdd
println(updatedList) // [apple, banana, grape, kiwi]
val newList = list - "banana"
println(newList) // [apple]
//移除多個元素:
val fruitsToRemove = listOf("apple", "banana")
val remainingList = list - fruitsToRemove
println(remainingList) // []
在每次操作後,你都會得到一個新的列表,原始的列表並未被改變。這樣的好處是你可以保證資料的不變性,這對於防止非預期的副作用和增加程式碼的可讀性和可維護性都是有益的。
在 Kotlin 中有複寫 list opearator,其中要注意 += 會代表不同的意思,以下示例,如果是一個 var 的immuatable list += 會是得到一個新的 list
val list1: MutableList<Int> = mutableListOf()
var list2: List<Int> = listOf()
list1 += 1 // 等同於 list1.plusAssign(1)
list2 += 1 // 等同於 list2 = list2.plus(1)
今天來放具有節奏感的 LATATA