集合是開發中很是經常使用的知識,好比操做各類數據集,各類算法,保存網絡請求結果,做爲Adapter數據集,若是你不會集合的知識,那麼可能連顯示一個基本的ListView列表都作不到,今天就來講說Kotlin中集合的知識。javascript
Kotlin 中的集合按照可變性分類能夠分爲:java
按照類型分類能夠分爲:算法
結合在一塊兒就是說List,Map,Set又均可以分爲可變和不可變兩種。
具體來講
對於Listapi
對於Map數組
對於Set網絡
除此以外還有四個基本接口函數
此外,記住List ,MutableList,Set,MutableSet 歸根到底都是Collection的子類。spa
Kotlin並無提供建立集合的函數,但咱們可使用以下方法來建立相應的集合code
建立一個不可變的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集合的方法
建立一個不可變的Set
val mList = setOf
(1,2,3)
建立一個可變的Set
val mList = mutableSetOf
(1,2,3)
此外還有以下方法
建立一個不可變的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的方式建立
此外還有
以上就是三種集合常見的建立方式,下面再來講說集合中的操做符,使用合適的操做符能夠極大的減少你的代碼量
說明:若是至少有一個元素符合判斷條件,則返回true,不然false,例:
val list = listOf(1, 2, 3, 4, 5)
list.any { it > 10 }
結果爲false
說明:若是集合中全部的元素都符合判斷條件,則返回true不然false,例:
val list = listOf(1, 2, 3, 4, 5)
list.any { it < 10 }
結果爲true
說明:返回集合中符合判斷條件的元素總數。例:
list.count { it <3 }
結果爲2
說明:在一個初始值的基礎上從第一項到最後一項經過一個函數累計全部的元素。例:
list.fold(0) { total, next -> total + next }
結果爲15 (計算方式:0+1+2+3+4+5,第一個數0 爲fold中的0,也就是初始值)
說明:與fold同樣,可是順序是從最後一項到第一項。例:
list.foldRight(0) { total, next -> total + next }
結果也爲15
說明:與fold同樣,可是沒有一個初始值。經過一個函數從第一項到最後一項進行累計。例:
list.reduce{ total, next -> total + next}
結果爲15
說明:與foldRight同樣,只不過沒有初始值。例:
list.reduceRight { total, next -> total + next }
結果也爲15
說明:遍歷全部元素,並執行給定的操做(相似於Java 中的for循環)。例:
list.forEach{ Log.i(TAG,it.toString()) }
結果爲:1 2 3 4 5
說明:與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
說明:返回集合中最大的一項,若是沒有則返回null。例:
Log.i(TAG, list.max().toString())
結果爲:5
說明:返回集合中最小的一項,若是沒有則返回null。例:
Log.i(TAG, list.min().toString())
結果爲:1
說明:根據給定的函數返回最大的一項,若是沒有則返回null。例:
Log.i(TAG, list.maxBy { it-10 }.toString())
結果爲 :5 (由於從1到5這5個元素中只有5減去10後的值最大,因此返回元素5,注意返回的不是計算結果)
說明:返回最小的一項,若是沒有則返回null。例:
Log.i(TAG, list.minBy { it-10 }.toString())
結果爲:1
說明:返回全部每一項經過函數轉換以後的數據的總和。例:
list.sumBy { it + 2 }
結果爲:25 (每一個元素都加2,最後求和)
說明:返回去掉前n個元素的列表。例:
val list = listOf(1, 2, 3, 4, 5)
var s = list.drop(2)
s.forEach {
Log.i(TAG, it.toString())
}
結果爲 :3 4 5(去掉了前兩個元素)
說明:返回根據給定函數從第一項開始去掉指定元素的列表。例:
list.dropWhile { it < 3 }
結果爲:3 4 5
說明:同dropWhile,可是是從最後一項開始。例:
list.dropLastWhile { it >3 }
結果爲:1 2 3
說明:過濾全部符合給定函數條件的元素。例:
list.filter { it > 2 }
結果爲:3 4 5
說明:過濾全部不符合給定函數條件的元素。例:
list.filterNot{ it > 2 }
結果爲:1 2
說明:過濾全部元素中不是null的元素。例:
list.filterNotNull()
結果爲:1 2 3 4 5
說明:過濾集合中指定index的元素(其實就是獲取指定index的元素)。例:
list.slice(listOf(0,1,2))
結果爲:1 2 3
說明:返回從第一個開始的n個元素。例:
list.take(2)
結果爲:1 2
說明:返回從最後一個開始的n個元素。例:
list.takeLast(2)
結果爲:4 5
說明:返回從第一個開始符合給定函數條件的元素。例:
list.takeWhile { it<3 }
結果爲:1 2
說明:遍歷全部的元素,爲每個建立一個集合,最後把全部的集合放在一個集合中。例:
list.flatMap { listOf(it, it + 1) }
結果爲: 1 2 2 3 3 4 4 5 5 6(每一個元素都執行加1後做爲一個新元素)
說明:返回一個根據給定函數分組後的map。例:
list.groupBy { if (it >3) "big" else "small" }
結果爲:
small=[1, 2, 3]
big=[4, 5]
說明:返回一個每個元素根據給定的函數轉換所組成的集合。例:
list.map { it * 2 }
結果爲:2 4 6 8 10
說明:返回一個每個元素根據給定的包含元素index的函數轉換所組成的集合。例:
list.mapIndexed { index, it -> index + it }
結果爲:1 3 5 7 9
說明:返回一個每個非null元素根據給定的函數轉換所組成的集合。例:
list.mapNotNull { it * 2 }
結果爲:2 4 6 8 10
說明:返回一個與指定集合相反順序的集合。例:
list.reversed()
結果爲:5 4 3 2 1
說明:返回一個天然排序後的集合。例:
val list = listOf(1, 2, 6, 4, 5)
var s = list.sorted()
結果爲 1 2 4 5 6
說明:返回一個根據指定函數排序後的集合。例:
val list = listOf(1, 2, 6, 4, 5)
var s = list.sortedBy { it - 2 }
結果爲 1 2 4 5 6
說明:返回一個降序排序後的集合。例:
list.sortedDescending()
結果爲:5 4 3 2 1
說明:返回一個根據指定函數降序排序後的集合。例:
list.sortedByDescending { it % 2 }
結果爲: 1 3 5 2 4
說明:把一個給定的集合分割成兩個,第一個集合是由原集合每一項元素匹配給定函數條件返回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
說明:返回一個包含原集合和給定集合中全部元素的集合,由於函數的名字緣由,咱們可使用+操做符。例:
list + listOf(6, 7)
結果爲: 1 2 3 4 5 6 7
說明:返回由pair組成的List,每一個pair由兩個集合中相同index的元素組成。這個返回的List的大小由最小的那個集合決定。例:
list.zip(listOf(7, 8))
結果爲:(1, 7) (2, 8)
說明:從包含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
說明:指定元素能夠在集合中找到,則返回true,不然false。例:
list.contains(1)
結果爲:true
說明:返回給定index對應的元素,若是index數組越界則會拋出IndexOutOfBoundsException。例:
list.elementAt(1)
結果爲:2
說明:返回給定index對應的元素,若是index數組越界則會根據給定函數返回默認值。例:
list.elementAtOrElse(5, { it + 2 })
結果爲:7
說明:返回給定index對應的元素,若是index數組越界則會返回null。例:
list.elementAtOrNull(5)
結果爲:null
說明:返回符合給定函數條件的第一個元素。例:
list.first { it > 2 }
結果爲:3
說明:返回符合給定函數條件的第一個元素,若是沒有符合則返回null。例:
list.first { it > 8 }
結果爲:null
說明:返回指定元素的第一個index,若是不存在,則返回-1。例:
list.indexOf(2)
結果爲:1
說明:返回第一個符合給定函數條件的元素的index,若是沒有符合則返回-1。例:
list.indexOfFirst { it % 2 == 0 }
結果爲:1
說明:返回最後一個符合給定函數條件的元素的index,若是沒有符合則返回-1。例:
list.indexOfLast { it % 2 == 0 }
結果爲:3
說明:返回符合給定函數條件的最後一個元素。例:
list.last { it % 2 == 0 }
結果爲:4
說明:返回指定元素的最後一個index,若是不存在,則返回-1。例:
list.lastIndexOf(4)
結果爲:3
說明:返回符合給定函數條件的最後一個元素,若是沒有符合則返回null。例:
list.lastOrNull { it > 6 }
結果爲:null
說明:返回符合給定函數的單個元素,若是沒有符合或者超過一個,則拋出異常。例:
list.single { it > 4 }
結果爲:5
說明:返回符合給定函數的單個元素,若是沒有符合或者超過一個,則返回null。例:
list.singleOrNull { it > 5}
結果爲:null