一文掌握kotlin集合中的操作符

一文掌握kotlin集合中的操作符

一、过滤相关操作符

1、filter

  • fifter相关的共有如下:
  • filter:筛选符合条件的元素
  • filterNot:筛选不符合条件的元素
  • filterNotNull:过滤掉null值
  • filterIsInstance:保留指定类型的元素
  • filterIndexed:相比filter,就是条件函数多了index参数
  val list1 = listOf(1,2,3,4,5,6,7,8)
  val f1 = list1.filter { it > 5 }
  println("@@@ f1 filter :${f1}") // f1=[6, 7, 8]
  val f2 = list1.filterNot { it > 5 }
  println("@@@ f2 filterNot :${f2}") / f2=[1, 2, 3, 4, 5]
  val f3 = list1.filterIndexed { index, i -> index > 3 }
  println("@@@ f3 filterIndexed :${f3}") // f3=[5, 6, 7, 8]
  val list2 = listOf("t1", null,"t2", null, "t3",1,2,4,5)
  val f4  = list2.filterIsInstance<Int>() // 保留指定Int类型
  println("@@@ f4 filterIsInstance: $f4") // 1,2,3,4,5
  val f5 = list2.filterNotNull()
  println("@@@ f5 filterNotNull: $f5") // t1,t2, t3, 1,2,3,4,5

2、take

  • take(n):返回前n个元素的子集合。若n超过集合大小,返回整个集合

  • takeLast(n): 返回最后n个元素

  • takeWhile { 条件}:从首元素开始,持续截取满足条件的元素,遇到第一个不满足条件时立即停止

  • takeLaskWhile { 条件}: 从未元素开始反向截取满足条件的元素

  • takeIf { 条件}:若整个集合满足条件,返回原集合,否则返回null

  • takeUnless: 与takeIf逻辑相反

      val list1 = listOf(1,2,3,4)
      val f1 = list1.take(2)
      println("@@@ f1 take : $f1") // [1,2]
      val f2 = list1.takeLast(2)
      println("@@@ f2 takeLast: $f2") // [3,4]
      val list2 = listOf(1,2,3,4)
      val f3 = list2.takeWhile { it < 3 }
      println("@@@ f3 takeWhile: $f3") // [1,2]
      val f4 = list2.takeIf {it.size == 4} // [1,2,3,4]
      println("@@@ f4 takeWhile: $f4") // [1,2,3,4]
      val f5 = list2.takeUnless { it.size == 2 }
      println("@@@ f5 takeWhile: $f5") // [1,2,3,4]
    

3、drop

  • drop(n):跳过前n个元素,返回剩余部分
  • dropLast(n):跳过最后n个元素
  • dropWhile { 条件}:从首元素开始跳过满足条件的元素,遇到第一个不满足条件保留剩余所有元素(即使后续元素又满足条件)
  • dropLastWhile { 条件}:从末元素开始反向跳过满足条件的元素
    val f1 = listOf(1, 2, 3).drop(1) // [2,3]
    println("@@@ f1 drop: $f1 ")
    val f2 = listOf(1,2,3).dropLast(1)
    println("@@@ f2 drop: $f2 ") // [1,2]
    val f3 = listOf(1,2,3,0).dropWhile { it < 3 }
    println("@@@ f3 dropWhile:$f3") // [3,0]
    val f4 = listOf(1,2,3,0).dropLastWhile { it < 3 }
    println("@@@ f4 dropLastWhile: $f4") // [1,2,3]

二、转换操作符

1、map

map用于对集合中的每个元素进行转换,生成一个新的集合

  • map:对集合中的每个元素应用转换函数(transform:(T) -> R),返回一个新集合List<R>

  • mapNotNull:自动跳过转换结果为null的元素,返回非空集合

        val numbers  = listOf(1,2,3,4)
        val events = numbers.map { if (it %2 == 0) it * 2 else it}
        println("@@@ map: $events ") // [1,4,3,8]
        val evensNotNull = numbers.mapNotNull { if (it %2 == 0) it else null }
        println("@@@ mapNotNull:$evensNotNull") // [2,4]
    

2、flatmap?

todo

3、groupBy

用于按条件分组的核心高阶函数,能够将集合根据指定的键(Key)分为多个子集合,返回一个Map<k, List<T>>结构

    val numbers = listOf(1, 2, 3, 4, 5)
    val oddEventGroups = numbers.groupBy { if (it % 2 == 0) "Event" else "Odd" }
    println("@@@ groupBy:$oddEventGroups ") // {Odd=[1, 3, 5], Event=[2, 4]}
    println("@@@ Odd ${oddEventGroups["Odd"]}") // [1,3,5]
    println("@@@ Odd ${oddEventGroups["Event"]}") // [2,4]

三、聚合操作符号

1、reduce/fold

reduce和fold是kotlin 集合中应用聚合计算的核心高阶函数,能够将集合元素合并为单一结果

  • reduce:从集合第一个元素开始,依次将当前结果与下一元素通过operation合并

  • Fold:容许指定初始值(inital),并支持返回类型与集合元素不同(如Int 转String)

        val list = listOf(1,2,3)
        val f1 = list.reduce { acc, i ->  acc * i}
        println("@@@ f1 reduce: $f1") // 6
        val f2 = list.fold(10) {acc, i -> acc + i}
        println("@@ f2 fold: $f2") // 16
    

2、sum/average/min/max

集合求和、平均值、最小值、最大值

  • sumBy:根据条件求和

  • minBy/maxBy:根据条件返回最小/最大值,返回的还是集合原有的类型

    data class Person(val name: String, val age:Int)
    fun filterDemo() {
        val list = listOf(1, 2, 3, 4, 5)
        println("@@@ sum:${list.sum()}") // 15
        println("@@@ average ${list.average()}") // 3.0
        println("@@@ min :${list.min()}") // 1
        println("@@@ max : ${list.max()}") // 5
    
        val persons = listOf(Person("Alice", 25), Person("Bob", 30))
        println("@@@ sumBy ${persons.sumOf { it.age }}") //55
        println("@@@ minBy ${persons.minBy { it.age }}") //Person(name=Alice, age=25)
        println("@@@ maxBy ${persons.maxBy { it.age }}") // Person(name=Bob, age=30)
    }
    

四、查找与判断操作符

1、first/last

first和last是kotlin集合操作中用于快速访问首尾元素的核心方法 ,支持基础检索和条件筛选

  • first/last:返回集合第一个元素/最后一个元素

  • first(predicate: (T) ->Boolean):返回满足条件第一个元素

  • last(predicate: (T) ->Boolean):返回满足条件最后一个元素

  • firstOrNull :无匹配返回null

  • lastOrNull:无匹配返回null

  • firstOrNull(predicate: (T) ->Boolean) :返回满足条件的第一个元素,无匹配时候返回空

  • lastOrNull(predicate: (T) ->Boolean):返回满足条件的最后一个元素,无匹配时候返回空

  •     val numbers = listOf(1, 2, 3, 4, 5)
        val first = numbers.first()
        println("@@@ first :$first") // 1
        val last = numbers.last()
        println("@@@ last :$last") // 5
    
        val emptyList = emptyList<Int>()
        println("@@@ firstOrNull:${emptyList.firstOrNull()}") // null
    
        val numbers2s = listOf(1, -2, 3, -4, 5)
        val firstEven = numbers2s.first { it %2 == 0 } 
        val lastEven = numbers2s.last {it < 0} 
        println("@@@ firstEven :$firstEven") // -2
        println("@@@ lastEven :$lastEven") // -4
    

2、any/all/none

  • any:检测集合中至少有一个元素满足条件
  • all:检测集合中所有元素均满足条件(空集合始终返回true,称为”空洞真值“)
  • none:检测集合中没有元素满足条件(与any 逻辑相反)
    val numbers = listOf(1, 2, 3)
    val f1 = numbers.any { it > 2 }
    println("@@@ f1  $f1") // true
    val words = listOf("cat", "dog")
    val f2 = words.all { it.length == 3 }
    println("@@@ f2  $f2") // true
    val names = listOf("Alice", "Bob")
    val f3 = names.none { it.startsWith("C")}
    println("@@@ f3 $f3") // true

五、排序与去重操作符

1、sort

Kotlin 提供了多种排序操作,用于对集合进行升序,降序或条件排序

  • sort(): 原地排序(仅用于MutableList),无返回值
  • sorted():返回新列表,原集合不变
  • sortBy/sortedBy:指定属性排序(升序)
  • sortByDescending/sortByDescending:按属性降序排序,用法和sortBy/sortedBy
data class Person(val name: String, val age: Int)

fun filterDemo() {
    val mutabltList = mutableListOf(3, 1, 4)
    mutabltList.sort()
    println("@@@ f1 sort :$mutabltList") // [1,3,4]

    val newlist = mutabltList.sorted()
    println("@@@ newlist sort :$newlist") // [1,3,4]

    val persons = listOf(Person("Alice", 30), Person("Bob", 25))
    val newPersons = persons.sortedBy { it.age } // [Person(name=Bob, age=25), Person(name=Alice, age=30)]
    println("@@@ newPersons sort :$newPersons")
    val newPersons2 = persons.sortedBy { it.name }
    println("@@@ newPersons2 sort :$newPersons2")  // [Person(name=Alice, age=25), Person(name=Bob, age=30)]
}

2、distince

用于去重的核心函数,能够快速过滤重复元素并保留唯一值

  • distinctly:按条件去重

        val list = listOf(1,2,2,3,1)
        val list1 = list.distinct()
        println("@@@ list1 :$list1")
        val fruits = listOf("Apple", "apple")
        val newlist = fruits.distinctBy { it.lowercase() }
        println("@@@ newlist :$newlist")
    

六、其他

1、zip

用于将两集合按索引一一配对的核心函数,生成一个包含Pair对象的新列表,如果集合长度不一致,

结果列表长度短的为准,多余元素被忽略

    val names = listOf("Alice", "Bob")
    val age = listOf(25,30)
    val paired = names.zip(age)
    println("@@@ zip :$paired") // [("Alice", 25), ("Bob", 30)]

2、partition

用于按条件将集合一份为二的核心函数,返回一个包含两个字集合的Pair,分别存储满足条件和不满足条件的元素

    val numbers = listOf(1, 2, 3, 4, 5)
    val (even, odd) = numbers.partition { it % 2 == 0 }
    println("@@@ even:$even  odd :$odd") // [2,4], [1,3,5]

3、chunked

固定大小块,将集合按指定大小化分为多个子列表(块),最后一个块可能小于指定大小

    val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val chunks = numbers.chunked(3)
    println("@@@ chunks :$chunks") // [[1, 2, 3], [4, 5, 6], [7, 8, 9]
    val sums = numbers.chunked(3) {it.sum()}
    println("@@@ sums :$sums") // [6, 15, 24, 10]

4、windowed

生成滑动窗口的子列表,支持重叠窗口和自定义步长,

    // size 窗口大小
    // step:滑动步长(默认为1,表示重叠窗口)
    // partialWindows :是否保留末尾不足窗口大小的子集 默认 false
    val numbers = listOf(1, 2, 3, 4, 5)
    val windows = numbers.windowed(3)
    println("@@@ windows:$windows")
    val nonvoerlap = numbers.windowed(3,3)
    println("@@@ nonvoerlap:$nonvoerlap")
    val withPartial = numbers.windowed(3, partialWindows = true)
    println("@@@ withPartial: $withPartial ")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容