Kotlin系列——集合操作

前言

今天給大家?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

以上純屬于個(gè)人平時(shí)工作和學(xué)習(xí)的一些總結(jié)分享,如果有什么錯(cuò)誤歡迎隨時(shí)指出,大家可以討論一起進(jìn)步。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容