前兩天快速的帶過了 Kotlin 中的集合是什麼跟特性,接著我們來補充一下集合寫入的方法吧!今天將著重於列表 (List) 與集 (Set) 的新增與刪除方法。
新增元素
val numbers = mutableListOf(1, 2, 3, 4)
// numbers.add(5, 5) // IndexOutOfBoundsException
numbers.add(5) // [1, 2, 3, 4, 5]
numbers.addAll(listOf(6, 7, 8)) // [1, 2, 3, 4, 5, 6, 7, 8]
numbers.addAll(3, setOf(3, 4)) // [1, 2, 3, 4, 5, 3, 4, 6, 7, 8]
mutableListOf
),如果這裡使用不可變列表宣告方式 (似第四行使用 listOf
),那麼後面將無法對 numbers
進行修改。val numbers = listOf("one", "two")
val newNumbers = numbers.plus("three") // [one, two, three]
val numbers2 = mutableListOf("one", "two")
numbers2 += listOf("four", "five") // [one, two, four, five]
有別於 add
、 addAll
,我們也可以使用加減的方法對列表或集進行新增,上面範例裡我們可以看到 +=
的用法會將新增後的列表賦予給原本變數,可以等價於:
numbers2 = numbers2 + listOf("four", "five")
其實不難想像為什麼 Kotlin 要保留兩種寫法,前者 add
系列其實是對原始變數直接進行修改 (注意,前天有提到就算使用 val
我還是可以對可變列表 (mutableList
) 的內容進行修改) ,而 plus
系列則是會有回傳值且回傳值為更新後的值。
如此設計對撰寫程式時增添靈活度,也請各位客官可以到 Kotlin Playground 體驗。
補充: 如果使用 println
檢視 add
系列回傳值可以發現他是布林型別,但這裡列表和集的反應並 非 相同,對於列表來說,只要是合法元素就可以順利新增至列表並回傳 true
;但對於集來說,如果欲加入的元素已經存在,則加入行為為非法,如此就會回傳 false
參考連結 (Kotlin Official)
移除元素
val numbers = mutableListOf(1, 2, 3, 4, 3)
numbers.remove(3) // [1, 2, 4, 3]
numbers.remove(5) // [1, 2, 4, 3]
numbers.removeAt(2) // [1, 2, 3]
numbers.removeAll(numbers) // []
val numbers2 = mutableListOf(1, 2, 3, 4, 3)
numbers2.retainAll { it >= 3 } // [3, 4, 3]
numbers2.clear() // []
add
系列,我們用 remove
來移除列表、集內的元素val numbers = listOf("one", "two", "three", "three", "four")
val newNumbers = numbers.minus("three") // [one, two, three, four]
// newNumbers -= "three" // Val cannot be reassigned
val numbers2 = mutableListOf("one", "two", "three", "four")
numbers2 -= listOf("four", "five") // [one, two, three]
//numbers -= listOf("four") // 上面那行等效於這行
-=
, -
等減號運算去移除列表或是集裡面的元素+
相同,須注意這類運算子是會有回傳值的,必須留意變數宣告的可變性。