Kotlin——集合詳解

Knight_Davion發表於2019-03-02

集合是開發中非常常用的知識,比如操作各種資料集,各種演算法,儲存網路請求結果,作為Adapter資料集,如果你不會集合的知識,那麼可能連顯示一個基本的ListView列表都做不到,今天就來說說Kotlin中集合的知識。

Kotlin 中的集合按照可變性分類可以分為:

  • 可變集合
  • 不可變集合

按照型別分類可以分為:

  • List集合
  • Map集合
  • Set集合

結合在一起就是說List,Map,Set又都可以分為可變和不可變兩種。
具體來說
對於List

  • List ——宣告不可變List集合
  • MutableList——宣告可變List集合

對於Map

  • Map——宣告不可變Map集合
  • MutableMap——宣告可變Map集合

對於Set

  • Set——宣告不可變Set集合
  • MutableSet——宣告可變Set集合

除此之外還有四個基本介面

  • Iterable ——所有集合的父類
  • MutableIterable —— 繼承於Iterabl介面,支援遍歷的同時可以執行刪除操作
  • Collection —— 繼承於Iterable介面,僅封裝了對集合的只讀方法
  • MutableCollection ——繼承於Iterable,Collection,封裝了新增或移除集合中元素的方法

此外,記住List ,MutableList,Set,MutableSet 歸根到底都是Collection的子類。

集合的建立

Kotlin並沒有提供建立集合的函式,但我們可以使用如下方法來建立相應的集合

List

建立一個不可變的list

val mList = listOf(1, 2, 3)

建立一個可變的list

val mList = mutableListOf(1, 2, 3)

這裡mutableListOf初始化了三個值,如果沒有這三個值就相當於一個空集合,比如

 val mList = mutableListOf<Int>()
    Log.i(TAG, "mList size:" + mList.size)
    mList.add(1)
    mList.add(2)
    Log.i(TAG, "mList size:" + mList.size)複製程式碼

列印結果為

com.kotlin.collection.example I/MainActivity: mList size:0
com.kotlin.collection.example I/MainActivity: mList size:2

這樣就可以給需要初始值為空的列表進行賦值了,比如ListView的Adapter初始值為空的情況。
此外還有兩個宣告List集合的方法

  • emptyList()——建立一個空集合
  • listOfNotNull ()—— 建立的集合中不能插入null值

Set

建立一個不可變的Set

val mList = setOf(1,2,3)

建立一個可變的Set

val mList = mutableSetOf(1,2,3)

此外還有如下方法

  • emptySet() ——建立一個空的set集合
  • linkedSetOf()—— 建立set連結串列集合

Map

建立一個不可變的Map

val mList = mapOf(Pair(“key1”, 1), Pair(“key2”, 2))

或者

val mList = mapOf(“key1” to 1, “key2” to 2)

建立一個可變的Map

val mList = mutableMapOf(“key1” to 1, “key2” to 2)

推薦使用to的方式建立
此外還有

  • emptyMap()——建立一個空map
  • hashMapOf()——建立一個hashMap
  • linkedMapOf()——建立一個linkedMap
  • sortedMapOf()——建立一個sortedMap

以上就是三種集合常見的建立方式,下面再來說說集合中的操作符,使用合適的操作符可以極大的減小你的程式碼量

操作符

總數操作

any

說明:如果至少有一個元素符合判斷條件,則返回true,否則false,例:

val list = listOf(1, 2, 3, 4, 5)
list.any { it > 10 }

結果為false

all

說明:如果集合中所有的元素都符合判斷條件,則返回true否則false,例:

val list = listOf(1, 2, 3, 4, 5)
list.any { it < 10 }

結果為true

count

說明:返回集合中符合判斷條件的元素總數。例:

list.count { it <3 }

結果為2

fold

說明:在一個初始值的基礎上從第一項到最後一項通過一個函式累計所有的元素。例:

list.fold(0) { total, next -> total + next }

結果為15 (計算方式:0+1+2+3+4+5,第一個數0 為fold中的0,也就是初始值)

foldRight

說明:與fold一樣,但是順序是從最後一項到第一項。例:

list.foldRight(0) { total, next -> total + next }

結果也為15

reduce

說明:與fold一樣,但是沒有一個初始值。通過一個函式從第一項到最後一項進行累計。例:

list.reduce{ total, next -> total + next}

結果為15

reduceRight

說明:與foldRight一樣,只不過沒有初始值。例:

list.reduceRight { total, next -> total + next }

結果也為15

forEach

說明:遍歷所有元素,並執行給定的操作(類似於Java 中的for迴圈)。例:

list.forEach{ Log.i(TAG,it.toString()) }

結果為:1 2 3 4 5

forEachIndexed

說明:與forEach作用一樣,但是同時可以得到元素的index。例:

list.forEachIndexed { index, i -> Log.i(TAG, “index:” + index + ” value:” + i.toString()) }

結果為
index:0 value:1
index:1 value:2
index:2 value:3
index:3 value:4
index:4 value:5

max

說明:返回集合中最大的一項,如果沒有則返回null。例:

Log.i(TAG, list.max().toString())

結果為:5

min

說明:返回集合中最小的一項,如果沒有則返回null。例:

Log.i(TAG, list.min().toString())

結果為:1

maxBy

說明:根據給定的函式返回最大的一項,如果沒有則返回null。例:

Log.i(TAG, list.maxBy { it-10 }.toString())

結果為 :5 (因為從1到5這5個元素中只有5減去10後的值最大,所以返回元素5,注意返回的不是計算結果)

minBy

說明:返回最小的一項,如果沒有則返回null。例:

Log.i(TAG, list.minBy { it-10 }.toString())

結果為:1

sumBy

說明:返回所有每一項通過函式轉換之後的資料的總和。例:

list.sumBy { it + 2 }

結果為:25 (每個元素都加2,最後求和)

過濾操作

drop

說明:返回去掉前n個元素的列表。例:

val list = listOf(1, 2, 3, 4, 5)
var s = list.drop(2)
s.forEach {
Log.i(TAG, it.toString())
}

結果為 :3 4 5(去掉了前兩個元素)

dropWhile

說明:返回根據給定函式從第一項開始去掉指定元素的列表。例:

list.dropWhile { it < 3 }

結果為:3 4 5

dropLastWhile

說明:同dropWhile,但是是從最後一項開始。例:

list.dropLastWhile { it >3 }

結果為:1 2 3

filter

說明:過濾所有符合給定函式條件的元素。例:

list.filter { it > 2 }

結果為:3 4 5

filterNot

說明:過濾所有不符合給定函式條件的元素。例:

list.filterNot{ it > 2 }

結果為:1 2

filterNotNull

說明:過濾所有元素中不是null的元素。例:

list.filterNotNull()

結果為:1 2 3 4 5

slice

說明:過濾集合中指定index的元素(其實就是獲取指定index的元素)。例:

list.slice(listOf(0,1,2))

結果為:1 2 3

take

說明:返回從第一個開始的n個元素。例:

list.take(2)

結果為:1 2

takeLast

說明:返回從最後一個開始的n個元素。例:

list.takeLast(2)

結果為:4 5

takeWhile

說明:返回從第一個開始符合給定函式條件的元素。例:

list.takeWhile { it<3 }

結果為:1 2

對映操作

flatMap

說明:遍歷所有的元素,為每一個建立一個集合,最後把所有的集合放在一個集合中。例:

list.flatMap { listOf(it, it + 1) }

結果為: 1 2 2 3 3 4 4 5 5 6(每個元素都執行加1後作為一個新元素)

groupBy

說明:返回一個根據給定函式分組後的map。例:

list.groupBy { if (it >3) “big” else “small” }

結果為:
small=[1, 2, 3]
big=[4, 5]

map

說明:返回一個每一個元素根據給定的函式轉換所組成的集合。例:

list.map { it * 2 }

結果為:2 4 6 8 10

mapIndexed

說明:返回一個每一個元素根據給定的包含元素index的函式轉換所組成的集合。例:

list.mapIndexed { index, it -> index + it }

結果為:1 3 5 7 9

mapNotNull

說明:返回一個每一個非null元素根據給定的函式轉換所組成的集合。例:

list.mapNotNull { it * 2 }

結果為:2 4 6 8 10

順序操作

reversed

說明:返回一個與指定集合相反順序的集合。例:

list.reversed()

結果為:5 4 3 2 1

sorted

說明:返回一個自然排序後的集合。例:

val list = listOf(1, 2, 6, 4, 5)
var s = list.sorted()

結果為 1 2 4 5 6

sortedBy

說明:返回一個根據指定函式排序後的集合。例:

val list = listOf(1, 2, 6, 4, 5)
var s = list.sortedBy { it – 2 }

結果為 1 2 4 5 6

sortedDescending

說明:返回一個降序排序後的集合。例:

list.sortedDescending()

結果為:5 4 3 2 1

sortedByDescending

說明:返回一個根據指定函式降序排序後的集合。例:

list.sortedByDescending { it % 2 }

結果為: 1 3 5 2 4

生產操作

partition

說明:把一個給定的集合分割成兩個,第一個集合是由原集合每一項元素匹配給定函式條件返回true的元素組成,第二個集合是由原集合每一項元素匹配給定函式條件返回false的元素組成。例:

val list = listOf(1, 2, 3, 4, 5)
var s = list.partition { it > 2 }
s.first.forEach {
    Log.i(TAG, it.toString())
}
s.second.forEach {
    Log.i(TAG, it.toString())
}複製程式碼

結果為:
3 4 5
1 2

plus

說明:返回一個包含原集合和給定集合中所有元素的集合,因為函式的名字原因,我們可以使用+操作符。例:

list + listOf(6, 7)

結果為: 1 2 3 4 5 6 7

zip

說明:返回由pair組成的List,每個pair由兩個集合中相同index的元素組成。這個返回的List的大小由最小的那個集合決定。例:

list.zip(listOf(7, 8))

結果為:(1, 7) (2, 8)

unzip

說明:從包含pair的List中生成包含List的Pair。例:

var s = listOf(Pair(1, 2), Pair(3, 4)).unzip()
s.first.forEach {
    Log.i(TAG, it.toString())
}
s.second.forEach {
    Log.i(TAG, it.toString())
}複製程式碼

結果為:1 2 3 4

元素操作

contains

說明:指定元素可以在集合中找到,則返回true,否則false。例:

list.contains(1)

結果為:true

elementAt

說明:返回給定index對應的元素,如果index陣列越界則會丟擲IndexOutOfBoundsException。例:

list.elementAt(1)

結果為:2

elementAtOrElse

說明:返回給定index對應的元素,如果index陣列越界則會根據給定函式返回預設值。例:

list.elementAtOrElse(5, { it + 2 })

結果為:7

elementAtOrNull

說明:返回給定index對應的元素,如果index陣列越界則會返回null。例:

list.elementAtOrNull(5)

結果為:null

first

說明:返回符合給定函式條件的第一個元素。例:

list.first { it > 2 }

結果為:3

firstOrNull

說明:返回符合給定函式條件的第一個元素,如果沒有符合則返回null。例:

list.first { it > 8 }

結果為:null

indexOf

說明:返回指定元素的第一個index,如果不存在,則返回-1。例:

list.indexOf(2)

結果為:1

indexOfFirst

說明:返回第一個符合給定函式條件的元素的index,如果沒有符合則返回-1。例:

list.indexOfFirst { it % 2 == 0 }

結果為:1

indexOfLast

說明:返回最後一個符合給定函式條件的元素的index,如果沒有符合則返回-1。例:

list.indexOfLast { it % 2 == 0 }

結果為:3

last

說明:返回符合給定函式條件的最後一個元素。例:

list.last { it % 2 == 0 }

結果為:4

lastIndexOf

說明:返回指定元素的最後一個index,如果不存在,則返回-1。例:

list.lastIndexOf(4)

結果為:3

lastOrNull

說明:返回符合給定函式條件的最後一個元素,如果沒有符合則返回null。例:

list.lastOrNull { it > 6 }

結果為:null

single

說明:返回符合給定函式的單個元素,如果沒有符合或者超過一個,則丟擲異常。例:

list.single { it > 4 }

結果為:5

singleOrNull

說明:返回符合給定函式的單個元素,如果沒有符合或者超過一個,則返回null。例:

list.singleOrNull { it > 5}

結果為:null

相關文章