Kotlin——集合詳解

集合是開發中很是經常使用的知識,好比操做各類數據集,各類算法,保存網絡請求結果,做爲Adapter數據集,若是你不會集合的知識,那麼可能連顯示一個基本的ListView列表都作不到,今天就來講說Kotlin中集合的知識。javascript

Kotlin 中的集合按照可變性分類能夠分爲:java

  • 可變集合
  • 不可變集合

按照類型分類能夠分爲:算法

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

結合在一塊兒就是說List,Map,Set又均可以分爲可變和不可變兩種。
具體來講
對於Listapi

  • 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的子類。spa

集合的建立

Kotlin並無提供建立集合的函數,但咱們可使用以下方法來建立相應的集合code

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

相關文章
相關標籤/搜索