Kotlin入門筆記四:集合

kotlin.jpeg
集合的種類和寫法
一提到集合,那麼大家不由自主的想到List、Set、Map。沒錯,在Kotlin中也包含了這三類集合。
-
List:可能是最流行的集合型別。他是一個有序的集合,正因為它的有序,我們可以使用get函式通過position來訪問。
-
Set:一個無序並不重複item的集合。
-
Map:一個以鍵值對"key-value"形式存在的集合。key在map中是唯一的,也就是說不能有兩對key樣的鍵值對存在於一個map中。
介紹了三中集合的概念之後,我們來看看它們在Kotlin裡的寫法,和Java有所不同:
fun main(args: Array<String>) { val list = listOf<Int>(1, 2, 3, 4) val set = setOf<Int>(1, 2, 3, 4) val map = mapOf<Int, String>(1 to "a", 2 to "b", 3 to "c") println(list) println(set) println(map) } // 輸出 // [1, 2, 3, 4] // [1, 2, 3, 4] // {1=a, 2=b, 3=c}
Kotlin中定義一個集合不需要像Java那麼繁瑣,如果在定義的時候你明確了集合中的型別,你甚至都可以不需要宣告集合中資料的型別,如 val list = listOf(1,2,3,4)
。
這裡需要注意的是Map集合,通過Map的原始碼 public fun <K, V> mapOf(vararg pairs: Pair<K, V>)
可以看出, mapOf
傳入的引數其實是 Pair(K,V)
,所以我們可以在宣告Map集合的時候傳入一個個 Pair
,如: val map = mapOf<Int, String>(Pair(1, "a"), Pair(1, "a"), Pair(1, "a"))
,但是這種寫法太冗餘了,Kotlin中還可以通過 to
函式來生成一個 Pair
物件,寫法為 val map = mapOf<Int, String>(1 to "a", 2 to "b", 3 to "c")
,其實 1 to "a"
就等同與 Paid(1,"a")
,但是從肉眼上就能看出 to
函式的寫法要簡單多了。所以推薦大家以後再宣告鍵值對型別的常量,使用 to
函式來宣告。
集合的擴充套件函式
Kotlin給開發者提供了很多方便的擴充套件函式,如:
-
max():取集合中最大值
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) println(list.max()) } // 4
-
last:返回集合中最後一個元素
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) println(list.last()) } // 4
除了
last()
之外,還有其它一些類似的函式,如lastIndexOf(T)
,返回最後一個匹配T的index。更多的大家可以去官網的API瞭解,在這筆者就不過多介紹了。 -
filter:遍歷集合並選出符合條件的元素
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) println(list.filter { it % 2==0 }) } // [2, 4]
list.filter { it % 2==0 }
這是一個Lambda表示式,在接下來筆者會帶著大家一起學習,在這裡暫不多介紹,只需要知道it
代表的是遍歷集合的每一個元素。從輸出結果中可以看出,集合中滿足除以2取餘為0的都打印出來了,用了filter
函式之後,就不需要大家手動去遍歷集合,判斷,最後列印了。 -
map:遍歷集合中每一個元素,並且對這些元素進行給定函式處理後返回到一個新集合中
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) // 對每一個元素加1 println(list.map { it + 1 }) } // [2, 3, 4, 5]
-
all:如果全部的元素都符合函式內條件,則返回
true
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) // 判斷集合中元素是否都大於2 println(list.all { it > 2 }) } // false
-
any:如果集合中有一個或一個以上的元素滿足函式內條件,則返回
true
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) // 判斷集合中是否存在大於2的元素 println(list.any { it > 2 }) } // true
-
count:返回符合函式內條件的元素個數
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) // 計算集合中大於2的元素個數 println(list.count { it > 2 }) } // 2
-
groupBy:將集合按照函式內條件分組
class Person(val name: String, val age: Int) { override fun toString(): String { return "Person(name='$name', age=$age)" } } fun main(args: Array<String>) { val persons = listOf(Person("ming", 22), Person("hong", 21), Person("tao", 22)) // 對persons按照年齡相同分組 println(persons.groupBy { it.age }) } // {22=[Person(name='ming', age=22), Person(name='tao', age=22)], // 21=[Person(name='hong', age=21)]}
從列印結果可以看到,年齡為22的分在一個組合中,21則存在於另外一個組合
除了上面介紹的一些擴充套件函式之外,Kotlin還提供了很多額外的函式,如: flatMap
、 first
、 sort
等等一系列,大家可以去 Kotlin文網站 上面仔細學習,這些函式可以在日常開發中帶來很便捷的操作。