Kotlin使用心得(三):集合(Collections: List, Map, Set)

Carter Chen
1 min readMay 30, 2018

--

Photo by Gala Rodriguez on Unsplash

正文開始

Kotlin中要生成一個ListMapSet非常簡單直覺,以生成List為例:

val list = listOf(1, 2, 3)
println(list)
// 結果:
// [1, 2, 3]

要生成List就用listOf()、要生成Map就用mapOf()Set呢?用setOf()

val list = listOf(1, 2, 3)
val map = mapOf(1 to 1, 2 to 2, 3 to 3)
val set = setOf(1 to 1, 2 to 2, 3 to 3)
println(list)
println(map)
println(set)
// 結果:
// [1, 2, 3]
// {1=1, 2=2, 3=3}
// [(1, 1), (2, 2), (3, 3)]

讀取值呢?

println(list[0])
println(map[1])
println(set.elementAt(0))
// 結果:
// 1
// 1
// (1, 1)

寫入值呢?

list.add(4) // 編譯失敗

請播放:流浪者之歌

原來,不管是listOf(), mapOf(), setOf()等等,預設都是唯讀的。

根據官方文件:

Unlike many languages, Kotlin distinguishes between mutable and immutable collections (lists, sets, maps, etc). Precise control over exactly when collections can be edited is useful for eliminating bugs, and for designing good APIs.

講中文好嗎:

与大多数语言不同,Kotlin 区分可变集合和不可变集合(lists、sets、maps 等)。精确控制什么时候集合可编辑有助于消除 bug 和设计良好的 API。

其實,上述的listOf(), mapOf(), setOf()等用法,創建出來的都是「不可變」的集合,若是要創建「可變」的集合,必須加入mutable,所以:

  • 要創建可變的List: mutableListOf()
  • 要創建可變的Map: mutableMapOf()
  • 要創建可變的Set: mutableSetOf()
val mList = mutableListOf(1, 2, 3)
mList[0]
mList.add(4) // 寫入4, 編譯成功

val mMap = mutableMapOf(1 to 1, 2 to 2, 3 to 3)
mMap[1]
mMap.put(4, 4) // 寫入Pair 編譯成功

val mSet = mutableSetOf(1 to 1, 2 to 2, 3 to 3)
mSet.elementAt(0)
mSet.add(4 to 4) // 寫入Pair 編譯成功

--

--

No responses yet