前言
今天給大家?guī)?lái)Kotlin系列的第四篇文章,集合操作,在Kotlin中,集合主要有以下幾種
Iterable:父類。任何類繼承這個(gè)接口就表示可以遍歷序列的元素。
MutableIterable:在迭代期間支持移除項(xiàng)目的迭代。
Collection:這個(gè)類表示元素的泛型集合。我們可以訪問(wèn)函數(shù):返回集合尺寸、集合是否為空、包含一項(xiàng)或一組。由于集合是不可變的,這類集合的所有方法只能請(qǐng)求數(shù)據(jù)。
MutableCollection:支持添加和移除元素的Collection。它提供額外的函數(shù),如:add、remove或clear等等。
List:或許這是最常用的集合。這表示有序的元素泛型集合。由于是有序的,我們可以用get函數(shù),按照項(xiàng)目的位置請(qǐng)求項(xiàng)目。
MutableList:支持添加和移除元素的List。
Set:不支持重復(fù)元素的無(wú)序元素集合。
MutableSet:支持添加和移除元素的Set。
Map:key-value 鍵-值對(duì)集合。在映射表(map)中key(鍵)是唯一的,就是說(shuō)在一個(gè)映射表中不能有兩對(duì)有相同的key。
MutableMap:支持添加和移除元素的Map。
演示
給大家?guī)?lái)這一篇集合操作的目的就是讓大家寫出更加簡(jiǎn)介的代碼,舉個(gè)例子
比如我們現(xiàn)在有一個(gè)集合students,集合里面有10個(gè)數(shù)據(jù),數(shù)據(jù)的id是0到9,我們判斷其中是否有一個(gè)id等于5,如果有就返回true
java代碼
for (Student student : students) {
if (student.getId() == 5){
return true;
}
}
return false;
kotlin代碼
return students.any { it.id == 5 }
看到差別了么,同樣的邏輯在kotlin中只需要一行代碼。
好戲開場(chǎng)
這里我先定義一個(gè)集合,下面會(huì)用到
val list = listOf(0, 1, 2, 3, 4, 5, 6, 7)
聚合操作
-
any——判斷集合中是否有滿足條件的元素,有就返回true。
println(list.any { it % 2 == 1 })
打印結(jié)果:true
-
all——如果集合中的元素都滿足條件,就返回true。
println(list.all { it % 2 == 1 })
打印結(jié)果:false
-
none——如果集合中的元素都不滿足條件,則返回true
println(list.none { it % 2 == 10 })
打印結(jié)果:true
-
count——查詢集合中滿足條件的元素個(gè)數(shù)
println(list.count { it % 2 == 1 })
打印結(jié)果:4
-
forEach——遍歷元素,元素是it(你也可以隨便取名字),可對(duì)每個(gè)元素進(jìn)行相關(guān)操作
list.forEach { it -> if (it > 6) println(it) }
打印結(jié)果:7
-
forEachIndexed——-遍歷元素,同時(shí)得到元素index(索引)
list.forEachIndexed { index, it -> if (it > 6) println("大于6的值是$it索引是$index") }
打印結(jié)果:大于6的值是7索引是7
-
max——-返回最大元素。如果沒有元素,則返回null
println(list.max())
打印結(jié)果:7
-
min——查詢最小的元素,如果沒有則返回null
println(list.min())
打印結(jié)果:0
-
fold——在給定初始值的基礎(chǔ)上,從第一項(xiàng)到最后一項(xiàng)進(jìn)行累加
//比如這里我給的初始值為10
println(list.fold(10) { total, next -> total + next })
打印結(jié)果:38
-
foldRight——在給定初始值的基礎(chǔ)上,從最后一項(xiàng)到第一項(xiàng)進(jìn)行累加,與fold只是的方向不同;
//比如這里我給的初始值為10
println(list.foldRight(10) { total, next -> total + next })
打印結(jié)果:38
-
reduce——同fold,區(qū)別就是沒有初始值
println(list.reduce { total, next -> total + next })
打印結(jié)果:28
-
rreduceRight——同reduce,只不過(guò)是從最后一項(xiàng)到第一項(xiàng)進(jìn)行累加
println(list.reduceRight { total, next -> total + next })
打印結(jié)果:28
-
sumBy——返回集合中元素進(jìn)轉(zhuǎn)換后產(chǎn)生值的總和
println(list.sumBy { it % 2 })
打印結(jié)果:4
過(guò)濾操作
-
drop——返回第N個(gè)元素之后的所有列表,但不包括第N個(gè)元素
println(list.drop(4))
//去掉了0,1,2,3這4個(gè)元素
打印結(jié)果:[4, 5, 6, 7]
-
dropWhile——從第一項(xiàng)起,去掉滿足條件的元素,直到不滿足條件的一項(xiàng)為止,返回剩下所有的元素
println(list.dropWhile { it < 5 })
打印結(jié)果:[5,6,7]
-
dropLastWhile——從最后一項(xiàng)起,去掉滿足條件的元素,直到不滿足條件的一項(xiàng)為止,返回剩下所有的元素
println(list.dropLastWhile { it < 7 })
//因?yàn)?<5不滿足,所以直接停止,返回所有集合
打印結(jié)果:[0,1,2,3,4,5,6,7]
-
filter——過(guò)濾掉所有不滿足條件的元素
println(list.filter { it % 2 == 0 })
打印結(jié)果:[0,2,4,6]
-
filterNot——過(guò)濾掉所有滿足條件的元素
println(list.filterNot { it % 2 == 0 })
打印結(jié)果:[1,3,5,7]
-
filterNotNull——過(guò)濾掉所有值為null的元素
println(list.filterNotNull())
打印結(jié)果:[0,1,2,3,4,5,6,7]
-
take——從第一項(xiàng)開始,返回N個(gè)元素
println(list.take(3))
打印結(jié)果:[0,1,2]
-
takeLast——從最后一項(xiàng)開始,返回N個(gè)元素
println(list. takeLast(3))
打印結(jié)果:[5,6,7]
-
takeWhile——從第一項(xiàng)開始,返回N個(gè)元素,直到不滿足條件為止
println(list.takeWhile { it < 3 })
打印結(jié)果:[0,1,2]
映射操作
-
flatMap——合并兩個(gè)集合,可以在合并的時(shí)候?qū)Φ刂礽t做想要的操作
println(list.flatMap { listOf(it, it + 2) })
打印結(jié)果:[0,2,1,3,2,4,3,5,4,6,5,7,6,8,7,9]
-
groupBy——將集合中的元素按照某個(gè)條件分組,返回Map
println(list.groupBy { if (it % 2 == 0) "偶數(shù)和0" else "奇數(shù)" })
打印結(jié)果:{偶數(shù)和0=[0, 2, 4, 6], 奇數(shù)=[1, 3, 5, 7]}
-
map——將集合中的元素通過(guò)某個(gè)方法轉(zhuǎn)換后的結(jié)果存到一個(gè)集合中
println(list.map { it + 1 })
打印結(jié)果:[1,2,3,4,5,6,7,8]
-
mapIndexed——除了得到轉(zhuǎn)換后的結(jié)果,還可以拿到index(索引)
println(list.mapIndexed { index, it -> index + it })
打印結(jié)果:[0,2,4,6,8,10,12,14]
-
mapNotNull——執(zhí)行方法轉(zhuǎn)換前過(guò)濾掉為null的元素
println(list.mapNotNull { it + 1 })
打印結(jié)果:[1,2,3,4,5,6,7,8]
元素操作
-
contains——判斷集合中是否有指定元素,有則返回true
println(list.contains(3))
打印結(jié)果:true
-
elementAt——返回指定索引位置的元素。如果索引超出這個(gè)集合的范圍,則拋出IndexOutOfBoundsException。
println(list.elementAt(1))
打印結(jié)果:1
-
elementAtOrElse——查找索引對(duì)應(yīng)元素,如果越界會(huì)根據(jù)方法返回默認(rèn)值
println(list.elementAtOrElse(9, { it }))
打印結(jié)果:9
-
elementAtOrNull——返回索引位置的元素。如果索引超出這個(gè)集合的范圍,則返回null
println(list.elementAtOrNull(9))
打印結(jié)果:null
-
first——返回符合條件的第一個(gè)元素,沒有則會(huì)拋NoSuchElementException異常
println(list.first { it % 2 == 0 })
打印結(jié)果:0
-
firstOrNull——返回符合條件的第一個(gè)元素,沒有返回null
println(list.firstOrNull { it % 2 == 100 })
打印結(jié)果:null
-
last——返回符合條件的最后一個(gè)元素,沒有則會(huì)拋NoSuchElementException異常;
println(list.last { it % 2 == 0 })
打印結(jié)果:6
-
lastIndexOf——返回列表中指定元素的最后一次出現(xiàn)的索引,如果沒有元素返回-1
println(list.lastIndexOf(5))
打印結(jié)果:5
-
lastOrNull——返回符合條件的最后一個(gè)元素,沒有返回null
println(list.lastOrNull { it % 2 == 100 })
打印結(jié)果:null
-
indexOf——根據(jù)元素找索引,如何集合沒有包含元素,則返回-1
println(list.indexOf(3))
打印結(jié)果:3
-
indexOfFirst——返回第一個(gè)符合條件元素的索引,沒有返回-1
println(list.indexOfFirst { it % 2 == 0 })
打印結(jié)果:0
-
indexOfLast——返回最后一個(gè)符合條件元素的索引,沒有返回-1
println(list.indexOfLast { it % 2 == 0 })
打印結(jié)果:6
-
single——返回符合條件的單個(gè)元素,如有沒有符合的或符合超過(guò)一個(gè)分別會(huì)拋NoSuchElementException或IllegalArgumentException異常
println(list.single { it % 7 == 2 })
打印結(jié)果:2
-
singleOrNull——返回符合條件的單個(gè)元素,如有沒有符合或超過(guò)一個(gè),返回null
println(list.singleOrNull { it % 7 == 100 })
打印結(jié)果:null
生成操作
-
partition——將原始集合拆分兩個(gè)集合,一個(gè)集合包含判斷條件為true的元素,另一個(gè)集合包含判斷條件為false的元素
println(list.partition { it % 2 == 0 })
打印結(jié)果:([0, 2, 4, 6], [1, 3, 5, 7])
-
plus——將兩個(gè)List合并成一個(gè),由于函數(shù)名稱原因,我們可以使用“+”操作符
println(list.plus(listOf(8,9)))
打印結(jié)果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
zip——返回一個(gè)列表,該列表由兩個(gè)集合中相同索引元素建立的元素對(duì)。這個(gè)列表長(zhǎng)度為最短集合的長(zhǎng)度
println(list.zip(listOf(5, 6, 7)))
打印結(jié)果:[(0, 5), (1, 6), (2, 7)]
排序操作
-
reverse——集合逆序
println(list.reversed())
打印結(jié)果:[7, 6, 5, 4, 3, 2, 1, 0]
-
sorted——升序
println(list.sorted())
打印結(jié)果:[0, 1, 2, 3, 4, 5, 6, 7]
-
sortedBy——按照條件計(jì)算之后再升序排列
println(list.sortedBy {it % 3})
打印結(jié)果:[0, 3,6,1,4,7,2,5]
-
sortedDescending——降序
println(list.sortedDescending())
打印結(jié)果:[7, 6, 5, 4, 3, 2, 1, 0]
-
sortedByDescending——按照條件計(jì)算之后再降序排列
println(list.sortedByDescending{it % 3})
打印結(jié)果:[2,5,1,4,7,0,3,6]
總結(jié)
以上就是Kotlin語(yǔ)言的集合及相關(guān)操作,希望該文能幫助大家更好的使用Kotlin,可以更加快速高效的進(jìn)行安卓開發(fā)。
哇,寫了好久終于寫完了,看到這里了你還不點(diǎn)個(gè)贊么0_0