kotlin集合操作符初探

在kotlin中数组和list的操作符基本共同,所以在数组中可用的操作符也可以在list中使用。

统计操作符

  • any 只要有一个符合就返回true
  • all 所有条件符合才返回true
  • count 返回符合条件的数目
  • none 如果没有任何元素与给定的函数匹配,则返回true
  • max 返回最大值
  • min 返回最小值
  • fold 在一个初始值的基础上 从第一项到最后一项通过 一个函数操作 所有的元素
  • reduce 从第一项到最后一项通过 一个函数操作 所有的元素,相对于fold,没有初始值
  • sum 求数组中所有值的和
 val array = arrayOf(1, 2, 3, 4, 5, 6, 7)
    println("any,数组中有值等于7,${array.any { it == 7 }}")
    println("all,数组中是否所有值都大于3,${array.all { it > 3 }}")
    println("count,数组中大于5的值有几个,${array.count { it > 5 }}")
    println("none,数组中没有大于9的数,${array.none { it > 9 }}")
    println("max,数组中的最大值,${array.max()}")
    println("min,数组中的最小值,${array.min()}")
    println("fold操作符的例子,${array.fold(4) { returnValue, next -> returnValue + next }}")
    //相对于fold操作符,相当于返回值的初始值为0
    println("reduce操作符的例子,${array.reduce { returnValue, next -> returnValue + next }}")
    println("sum,求数组中所有值的总和(也可以用 fold和reduce操作实现),${array.sum()}")

any,数组中有值等于7,true
all,数组中是否所有值都大于3,false
count,数组中大于5的值有几个,2
none,数组中没有大于9的数,true
max,数组中的最大值,7
min,数组中的最小值,1
fold操作符的例子,32
reduce操作符的例子,28
sum,求数组中所有值的总和(也可以用 fold和reduce操作实现),28

元素操作符

  • contains,数组中是否包含某个元素
  • first,返回第一个满足给定条件的元素
  • last,返回最后一个满足给定条件的元素
  • indexOf,返回某个值在数组中的下标值
  • elementAt,返回数组中某个下标的值
  • single,返回数组中的满足条件的一个元素,如果没有或者满足条件的有多个就抛出异常
println("* contains,数组中是否包含值为5的元素,${array.contains(5)}")
println("* first,返回第一个满足给定条件的元素,大于3的条件,${array.first { it > 3 }}")
println("* last,返回最后一个满足给定条件的元素,大于5的条件,${array.last { it > 5 }}")
println("* indexOf,返回值为3在数组中的下标值,${array.indexOf(3)}")
println("* elementAt,返回数组中下标为2的值,${array.elementAt(2)}")
println("* single,返回数组中的满足条件的一个元素,如果没有或者满足条件的有多个就抛出异常,${array.single{it >6}}")

contains,数组中是否包含值为5的元素,true
first,返回第一个满足给定条件的元素,大于3的条件,4
last,返回最后一个满足给定条件的元素,大于5的条件,7
indexOf,返回值为3在数组中的下标值,2
elementAt,返回数组中下标为2的值,3
single,返回数组中的满足条件的一个元素,如果没有或者满足条件的有多个就抛出异常,7

顺序操作符

  • reversed,返回一个具有相反顺序的数组
  • sorted,返回一个升序的排序的数组
  • sortedDescending,返回一个降序排序的数组
  • sortedBy,根据指定的值进行升序排序
  • sortedByDescending,根据指定的值进行降序排序
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,返回一个具有相反顺序的数组${array.reversed()}")
    println("sorted,返回一个升序的排序的数组,${array.sorted()}")
    println("sortedDescending,返回一个降序排序的数组${array.sortDescending()}")
    val persons = arrayOf(Person(18, 45), Person(16, 50), Person(22, 48))
    persons.sortBy { it.age }
    println("sortedBy,根据指定的值进行升序排序,${persons.toString1()}")
    persons.sortByDescending { it.weight }
    println("sortedByDescending,根据指定的值进行降序排序,${persons.toString1()}")
}

reversed,返回一个具有相反顺序的数组[7, 6, 3, 4, 5, 2, 1]
sorted,返回一个升序的排序的数组,[1, 2, 3, 4, 5, 6, 7]

sortedDescending,返回一个降序排序的数组kotlin.Unit
sortedBy,根据指定的值进行升序排序,[{16,50},{18,45},{22,48}]
sortedByDescending,根据指定的值进行降序排序,[{16,50},{22,48},{18,45}]

映射操作符

  • map,返回一个列表,其中包含将给定 函数 应用于原始数组中每个元素的结果.
  • flatMap,返回在原始数组的每个元素上调用 函数 的结果,所产生的所有元素的单个列表。(flatMap的传入函数的返回必须是可迭代的 Iterable),flatMap的主要主要就是把多层的集合平铺成一层的。
  • flatten,返回给定集合中所有集合的所有元素的单个列表,相当于flatmap中的函数不对元素进行任何操作
  • groupBy 按照给定的元素进行分组,返回的是一个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中的数据 并过滤掉 大于等于10的数据
    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,"小蓝"))
    println("groupBy_age: ${persons.groupBy{it.age}}")
    println("groupBy_weight: ${persons.groupBy{it.weight}}")

    //通过应用到元素*的给定[keySelector]函数返回的键,将应用于原始数组*的[valueTransform]函数返回的值分组,
    // 并返回一个映射,其中每个组键与对应值列表相关联。 * *返回的映射保留了从原始数组产生的键的条目迭代顺序。
    println("groupBy 按年龄分组,并修改年龄分组中的实体类 == ${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,小蓝}]}
groupBy_weight: {45=[{16,45,小红}, {18,45,小紫}], 50=[{16,50,小绿}, {18,50,小蓝}]}
groupBy 按年龄分组,并修改年龄分组中的实体类 == {16=[{学生:小红,年级:9,年龄:16,体重:45}, {学生:小绿,年级:9,年龄:16,体重:50}], 18=[{学生:小紫,年级:11,年龄:18,体重:45}, {学生:小蓝,年级:12,年龄:18,体重:50}]}

过滤操作符

  • filter,返回数组中符合给定条件的元素列表
  • take,返回包含前[n]个元素的列表,(入参就是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]

生成操作符

  • zip,将两个数组进行和并,返回一个Pair的list ,pair中包含有两个数组中相同下标的元素,返回的list的长度,由最短的数组决定。(也可以自定义返回列表中的类型)
  • partition,返回一个Pair 其中包含两个列表,第一个列表时符合给定条件的列表,第二个列表时不合符条件的列表。(类似于filter ,只是把过来后的元素组成了一个列表一起返回了)
  • plus,返回一个在原数组的基础上,追加了一个新元素的新数组。原数组没有改变
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]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341