Kotlin 数据容器 - List 扩展(转换操作、过滤操作、排序操作、分组操作、集合操作、归纳操作、窗口操作)

List 概述

  1. List 是一个不可变的有序集合,一旦创建就不能修改其内容,即不能添加、删除、更改元素

  2. List 提供了丰富的操作函数来处理数据


一、转换操作

  1. 对 List 中的每个元素应用给定的转换函数
kotlin 复制代码
val nums = listOf(1, 2, 3)

println("nums: $nums")

val newNums = nums.map { it * 2 }

println("newNums: $newNums")
复制代码
# 输出结果

nums: [1, 2, 3]
newNums: [2, 4, 6]
  1. 对 List 中的每个元素应用给定的转换函数,同时提供元素的索引和值作为参数
kotlin 复制代码
val nums = listOf(1, 2, 3)

println("nums: $nums")

val newNums = nums.mapIndexed { idx, value ->
    "$idx-$value"
}

println("newNums: $newNums")
复制代码
# 输出结果

nums: [1, 2, 3]
newNums: [0-1, 1-2, 2-3]
  1. 将嵌套 List 的所有元素合并到一个 List 中
kotlin 复制代码
val list1 = listOf(listOf(1, 2), listOf(3, 4))

println("list1: $list1")

val list2 = list1.flatten()

println("list2: $list2")
复制代码
# 输出结果

list1: [[1, 2], [3, 4]]
list2: [1, 2, 3, 4]

二、过滤操作

  1. 过滤出指定类型的元素
kotlin 复制代码
val mixed = listOf(1, "A", 2, "B", 3)

println("mixed: $mixed")

val nums = mixed.filterIsInstance<Int>()

println("nums: $nums")
复制代码
# 输出结果

mixed: [1, A, 2, B, 3]
nums: [1, 2, 3]
  1. 过滤出满足条件的元素
kotlin 复制代码
val nums = listOf(1, 2, 3, 4, 5)

println("nums: $nums")

val result = nums.filter { it % 2 == 0 }

println("result: $result")
复制代码
# 输出结果

nums: [1, 2, 3, 4, 5]
result: [2, 4]
  1. 过滤掉为 null 的元素
kotlin 复制代码
val mixed = listOf(1, null, 2, null, 3)

println("mixed: $mixed")

val result = mixed.filterNotNull()

println("result: $result")
复制代码
# 输出结果

mixed: [1, null, 2, null, 3]
result: [1, 2, 3]

三、排序操作

  1. 对元素进行升序排序
kotlin 复制代码
val unsorted = listOf(3, 1, 4, 1, 5)

println("unsorted: $unsorted")

val sorted = unsorted.sorted()

println("sorted: $sorted")
复制代码
# 输出结果

unsorted: [3, 1, 4, 1, 5]
sorted: [1, 1, 3, 4, 5]
  1. 对元素进行降序排序
kotlin 复制代码
val unsorted = listOf(3, 1, 4, 1, 5)

println("unsorted: $unsorted")

val sortedDescending = unsorted.sortedDescending()

println("sortedDescending: $sortedDescending")
复制代码
# 输出结果

unsorted: [3, 1, 4, 1, 5]
sortedDescending: [5, 4, 3, 1, 1]
  1. 对元素进行自定义升序排序
kotlin 复制代码
val values = listOf("aa", "b", "ccc")

println("values: $values")

val custom = values.sortedBy { it.length }

println("custom: $custom")
复制代码
# 输出结果

values: [aa, b, ccc]
custom: [b, aa, ccc]

四、分组操作

  1. 根据条件将元素分组,返回一个 Map,其中,键是分组条件的结果,值是对应的元素列表
kotlin 复制代码
val words = listOf("apple", "banana", "orange", "pear")

println("words: $words")

val byLength = words.groupBy { it.length }

println("byLength: $byLength")
复制代码
# 输出结果

words: [apple, banana, orange, pear]
byLength: {5=[apple], 6=[banana, orange], 4=[pear]}
  1. 根据条件将元素分组,分成两个 List,第一个 List 包含满足条件的元素,第二个 List 包含不满足条件的元素
kotlin 复制代码
val words = listOf("apple", "banana", "orange", "pear")

println("words: $words")

val (longWords, shortWords) = words.partition { it.length > 5 }

println("longWords: $longWords")
println("shortWords: $shortWords")
复制代码
# 输出结果

words: [apple, banana, orange, pear]
longWords: [banana, orange]
shortWords: [apple, pear]

五、集合操作

  1. 并集:+ 操作符用于合并两个 List 的元素,允许重复

  2. 真并集:union 用于合并两个 List 的元素,返回 Set,自动去重

  3. 交集:intersect 返回两个 List 中都存在的元素,返回 Set

  4. 差集:- 操作符返回 a 有但 b 没有的元素

java 复制代码
val a = listOf(1, 2, 3)
val b = listOf(2, 3, 4)

val union = a + b
val union2 = a.union(b)
val intersect = a.intersect(b)
val subtract = a - b

println("union: $union")
println("union2: $union2")
println("intersect: $intersect")
println("subtract: $subtract")
复制代码
# 输出结果

union: [1, 2, 3, 2, 3, 4]
union2: [1, 2, 3, 4]
intersect: [2, 3]
subtract: [1]

六、归纳操作

  1. 对 List 的元素进行累积计算
kotlin 复制代码
val numbers = listOf(1, 2, 3, 4)

val sum = numbers.reduce { acc, i -> acc + i }

println("sum: $sum")
复制代码
# 输出结果

sum: 10
  1. 对 List 的元素进行累积计算,可以自定义初始值
kotlin 复制代码
val numbers = listOf(1, 2, 3, 4)

val product = numbers.fold(1) { acc, i -> acc + i }

println("product: $product")
复制代码
# 输出结果

sum: 11

七、窗口操作

  1. 将 List 划分为多个窗口,每个窗口包含 size 个连续元素
kotlin 复制代码
val seq = listOf(1, 2, 3, 4, 5)

val pairs = seq.windowed(2)

println("pairs: $pairs")
复制代码
# 输出结果

pairs: [[1, 2], [2, 3], [3, 4], [4, 5]]
  1. 将 List 划分为多个窗口,每个窗口包含 size 个连续元素,并对每个窗口应用处理函数并返回结果
kotlin 复制代码
val seq = listOf(1, 2, 3, 4, 5)

val slidingAvg = seq.windowed(3) { it.average() }

println("slidingAvg: $slidingAvg")
复制代码
# 输出结果

slidingAvg: [2.0, 3.0, 4.0]