kotlin集合操作符

在kotlin中數(shù)組和list的操作符基本共同拘泞,所以在數(shù)組中可用的操作符也可以在list中使用。

1摩泪、統(tǒng)計(jì)操作符

  • any 只要有一個符合就返回true
  • all 所有條件符合才返回true
  • count 返回符合條件的數(shù)目
  • none 如果沒有任何元素與給定的函數(shù)匹配族购,則返回true
  • max 返回最大值
  • min 返回最小值
  • fold 在一個初始值的基礎(chǔ)上 從第一項(xiàng)到最后一項(xiàng)通過 一個函數(shù)操作 所有的元素
  • reduce 從第一項(xiàng)到最后一項(xiàng)通過 一個函數(shù)操作 所有的元素旁瘫,相對于fold,沒有初始值
  • sum 求數(shù)組中所有值的和
 val array = arrayOf(1, 2, 3, 4, 5, 6, 7)
    println("any,數(shù)組中有值等于7非竿,${array.any { it == 7 }}")
    println("all,數(shù)組中是否所有值都大于3蜕着,${array.all { it > 3 }}")
    println("count,數(shù)組中大于5的值有幾個,${array.count { it > 5 }}")
    println("none,數(shù)組中沒有大于9的數(shù),${array.none { it > 9 }}")
    println("max,數(shù)組中的最大值承匣,${array.max()}")
    println("min,數(shù)組中的最小值蓖乘,${array.min()}")
    println("fold操作符的例子,${array.fold(4) { returnValue, next -> returnValue + next }}")
    //相對于fold操作符韧骗,相當(dāng)于返回值的初始值為0
    println("reduce操作符的例子嘉抒,${array.reduce { returnValue, next -> returnValue + next }}")
    println("sum,求數(shù)組中所有值的總和(也可以用 fold和reduce操作實(shí)現(xiàn)),${array.sum()}")

any,數(shù)組中有值等于7袍暴,true
all,數(shù)組中是否所有值都大于3些侍,false
count,數(shù)組中大于5的值有幾個,2
none,數(shù)組中沒有大于9的數(shù)政模,true
max,數(shù)組中的最大值岗宣,7
min,數(shù)組中的最小值,1
fold操作符的例子淋样,32
reduce操作符的例子耗式,28
sum,求數(shù)組中所有值的總和(也可以用 fold和reduce操作實(shí)現(xiàn)),28

2趁猴、元素操作符

  • contains,數(shù)組中是否包含某個元素
  • first,返回第一個滿足給定條件的元素
  • firstOrNull,報錯要判空處理刊咳;
  • last,返回最后一個滿足給定條件的元素
  • indexOf,返回某個值在數(shù)組中的下標(biāo)值
  • elementAt,返回數(shù)組中某個下標(biāo)的值
  • single,返回數(shù)組中的滿足條件的一個元素,如果沒有或者滿足條件的有多個就拋出異常
  • find,找到第一個符合條件的值并返回
val array = arrayOf(1, 2, 3, 4, 5, 6, 7)
println("* contains,數(shù)組中是否包含值為5的元素躲叼,${array.contains(5)}")
println("* first,返回第一個滿足給定條件的元素,大于3的條件芦缰,${array.first { it > 3 }}")
println("* last,返回最后一個滿足給定條件的元素,大于5的條件枫慷,${array.last { it > 5 }}")
println("* indexOf,返回值為3在數(shù)組中的下標(biāo)值让蕾,${array.indexOf(3)}")
println("* elementAt,返回數(shù)組中下標(biāo)為2的值,${array.elementAt(2)}")
println("* single,返回數(shù)組中的滿足條件的一個元素或听,如果沒有或者滿足條件的有多個就拋出異常探孝,${array.single{it >6}}")
println("* find,數(shù)組中的元素值,${array.find { it==7 }}")

contains,數(shù)組中是否包含值為5的元素誉裆,true
first,返回第一個滿足給定條件的元素,大于3的條件顿颅,4
last,返回最后一個滿足給定條件的元素,大于5的條件足丢,7
indexOf,返回值為3在數(shù)組中的下標(biāo)值粱腻,2
elementAt,返回數(shù)組中下標(biāo)為2的值,3
single,返回數(shù)組中的滿足條件的一個元素斩跌,如果沒有或者滿足條件的有多個就拋出異常绍些,7
find,數(shù)組中的元素值,7

3耀鸦、順序操作符

  • reversed柬批,返回一個具有相反順序的數(shù)組
  • sorted啸澡,返回一個升序的排序的數(shù)組
  • sortedDescending,返回一個降序排序的數(shù)組
  • sortedBy氮帐,根據(jù)指定的值進(jìn)行升序排序
  • sortedByDescending嗅虏,根據(jù)指定的值進(jìn)行降序排序
fun <T> Array<T>.toString1(): String {
    val sb = StringBuilder("[")
    for ((index, value) in this.withIndex()) {
        sb.append(value)
        sb.append(",")
    }
    sb.delete(sb.length - 1, sb.length)
    sb.append("]")
    return sb.toString()
}

data class Person(val age: Int, val weight: Int){
    override fun toString(): String {
        return "{$age,$weight}"
    }
}
fun main() {
    val array = arrayOf(1, 2, 5, 4, 3, 6, 7)
    println("reversed,返回一個具有相反順序的數(shù)組${array.reversed()}")
    println("sorted上沐,返回一個升序的排序的數(shù)組皮服,${array.sorted()}")
    println("sortedDescending,返回一個降序排序的數(shù)組${array.sortDescending()}")
    val persons = arrayOf(Person(18, 45), Person(16, 50), Person(22, 48))
    persons.sortBy { it.age }
    println("sortedBy奄容,根據(jù)指定的值進(jìn)行升序排序冰更,${persons.toString1()}")
    persons.sortByDescending { it.weight }
    println("sortedByDescending,根據(jù)指定的值進(jìn)行降序排序昂勒,${persons.toString1()}")
}

reversed蜀细,返回一個具有相反順序的數(shù)組[7, 6, 3, 4, 5, 2, 1]
sorted,返回一個升序的排序的數(shù)組戈盈,[1, 2, 3, 4, 5, 6, 7]
sortedDescending奠衔,返回一個降序排序的數(shù)組kotlin.Unit
sortedBy,根據(jù)指定的值進(jìn)行升序排序塘娶,[{16,50},{18,45},{22,48}]
sortedByDescending归斤,根據(jù)指定的值進(jìn)行降序排序,[{16,50},{22,48},{18,45}]

4刁岸、映射操作符

  • map脏里,返回一個列表,其中包含將給定 函數(shù) 應(yīng)用于原始數(shù)組中每個元素的結(jié)果.
  • flatMap虹曙,返回在原始數(shù)組的每個元素上調(diào)用 函數(shù) 的結(jié)果迫横,所產(chǎn)生的所有元素的單個列表。(flatMap的傳入函數(shù)的返回必須是可迭代的 Iterable)酝碳,flatMap的主要主要就是把多層的集合平鋪成一層的矾踱。
  • flatten,返回給定集合中所有集合的所有元素的單個列表疏哗,相當(dāng)于flatmap中的函數(shù)不對元素進(jìn)行任何操作
  • groupBy 按照給定的元素進(jìn)行分組呛讲,返回的是一個map
 val array = arrayOf(1, 2, 5, 4, 3, 6, 7)
    println("map1: ${array.map { it % 2 == 0 }}")
    println("map2: ${array.map { it + 3 }}")
    val array1 = mutableListOf(mutableListOf(1, 5, 9),mutableListOf(11, 40, 21), mutableListOf(3, 15, 10), mutableListOf(6, 8, 10))
    println("array1 = $array1")
    //平鋪array1中的數(shù)據(jù) 并過濾掉 大于等于10的數(shù)據(jù)
    println("flatMap: ${array1.flatMap { it -> it.filter { it < 10 } }}")

    println("flatten: ${array1.flatten()}")
    val persons = arrayOf(Person(16,45,"小紅"),Person(16,50,"小綠"),Person(18,45,"小紫"),Person(18,50,"小藍(lán)"))
    println("groupBy_age: ${persons.groupBy{it.age}}")
    println("groupBy_weight: ${persons.groupBy{it.weight}}")

    //通過應(yīng)用到元素*的給定[keySelector]函數(shù)返回的鍵,將應(yīng)用于原始數(shù)組*的[valueTransform]函數(shù)返回的值分組返奉,
    // 并返回一個映射贝搁,其中每個組鍵與對應(yīng)值列表相關(guān)聯(lián)。 * *返回的映射保留了從原始數(shù)組產(chǎn)生的鍵的條目迭代順序芽偏。
    println("groupBy 按年齡分組雷逆,并修改年齡分組中的實(shí)體類 == ${persons.groupBy({it.age}){Student(it.age,it.weight,(9..12).random(),it.name)}}")

map1: [false, true, false, true, false, true, false]
map2: [4, 5, 8, 7, 6, 9, 10]
array1 = [[1, 5, 9], [11, 40, 21], [3, 15, 10], [6, 8, 10]]
flatMap: [1, 5, 9, 3, 6, 8]
flatten: [1, 5, 9, 11, 40, 21, 3, 15, 10, 6, 8, 10]
groupBy_age: {16=[{16,45,小紅}, {16,50,小綠}], 18=[{18,45,小紫}, {18,50,小藍(lán)}]}
groupBy_weight: {45=[{16,45,小紅}, {18,45,小紫}], 50=[{16,50,小綠}, {18,50,小藍(lán)}]}
groupBy 按年齡分組,并修改年齡分組中的實(shí)體類 == {16=[{學(xué)生:小紅,年級:9,年齡:16,體重:45}, {學(xué)生:小綠,年級:9,年齡:16,體重:50}], 18=[{學(xué)生:小紫,年級:11,年齡:18,體重:45}, {學(xué)生:小藍(lán),年級:12,年齡:18,體重:50}]}

5哮针、過濾操作符

  • filter,返回數(shù)組中符合給定條件的元素列表
  • filterNot,過濾出所有不滿足條件的元素
  • filterNotNull十厢,過濾出非NULL的元素
  • take等太,返回包含前[n]個元素的列表,(入?yún)⒕褪莕值)
  • drop蛮放,返回包含除前[n]個元素外的所有元素的列表
 val array = arrayOf(1, 2, 5, 4, 3, 6, 7)
    println("filter:${array.filter { it < 5 }}")
    println("take:${array.take(4)}")
    println("drop:${array.drop(4)}")

filter:[1, 2, 4, 3]
take:[1, 2, 5, 4]
drop:[3, 6, 7]

6缩抡、生成操作符

  • zip,將兩個數(shù)組進(jìn)行和并包颁,返回一個Pair的list 瞻想,pair中包含有兩個數(shù)組中相同下標(biāo)的元素,返回的list的長度娩嚼,由最短的數(shù)組決定蘑险。(也可以自定義返回列表中的類型)
  • partition,返回一個Pair 其中包含兩個列表岳悟,第一個列表時符合給定條件的列表佃迄,第二個列表時不合符條件的列表。(類似于filter 贵少,只是把過來后的元素組成了一個列表一起返回了)
  • plus呵俏,返回一個在原數(shù)組的基礎(chǔ)上,追加了一個新元素的新數(shù)組滔灶。原數(shù)組沒有改變
data class Person(val age: Int, val name: String) {
    override fun toString(): String {
        return "{$age,$name}"
    }
}

fun <T> Array<T>.toString1(): String {
    val sb = StringBuilder("[")
    for ((index, value) in this.withIndex()) {
        sb.append(value)
        sb.append(",")
    }
    sb.delete(sb.length - 1, sb.length)
    sb.append("]")
    return sb.toString()
}

fun main() {
    val array = arrayOf(1, 2, 5, 4, 3, 6, 7)
    val array1 = arrayOf("今天", "明天", "后天", "天天都愛你")
    println("zip1:${array.zip(array1)}")
    println("zip2:${array.zip(array1) { a, b -> Person(a,b) }}")
    println("partition:${array.partition { it < 5 }}")
    println("plus:${array.plus(19).toString1()}")
    println("array:${array.toString1()}")
}

zip1:[(1, 今天), (2, 明天), (5, 后天), (4, 天天都愛你)]
zip2:[person={1,今天}, person={2,明天}, person={5,后天}, person={4,天天都愛你}]
partition:([1, 2, 4, 3], [5, 6, 7])
plus:[1,2,5,4,3,6,7,19]
array:[1,2,5,4,3,6,7]


參考鏈接:http://www.reibang.com/p/a2d37bda3498
https://blog.csdn.net/I_can_move_you/article/details/120380455

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末普碎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子录平,更是在濱河造成了極大的恐慌麻车,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萄涯,死亡現(xiàn)場離奇詭異绪氛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)涝影,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門枣察,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人燃逻,你說我怎么就攤上這事序目。” “怎么了伯襟?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵猿涨,是天一觀的道長。 經(jīng)常有香客問我姆怪,道長叛赚,這世上最難降的妖魔是什么澡绩? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮俺附,結(jié)果婚禮上肥卡,老公的妹妹穿的比我還像新娘。我一直安慰自己事镣,他們只是感情好步鉴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著璃哟,像睡著了一般氛琢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上随闪,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天阳似,我揣著相機(jī)與錄音,去河邊找鬼蕴掏。 笑死障般,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盛杰。 我是一名探鬼主播挽荡,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼即供!你這毒婦竟也來了定拟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤逗嫡,失蹤者是張志新(化名)和其女友劉穎青自,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驱证,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡延窜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抹锄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逆瑞。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖伙单,靈堂內(nèi)的尸體忽然破棺而出获高,到底是詐尸還是另有隱情,我是刑警寧澤吻育,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布念秧,位于F島的核電站,受9級特大地震影響布疼,放射性物質(zhì)發(fā)生泄漏摊趾。R本人自食惡果不足惜币狠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砾层。 院中可真熱鬧总寻,春花似錦、人聲如沸梢为。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铸董。三九已至,卻和暖如春肴沫,著一層夾襖步出監(jiān)牢的瞬間粟害,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工颤芬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悲幅,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓站蝠,卻偏偏與公主長得像汰具,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子复局,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容