Kotlin 数据容器 - List 扩展(转换操作、过滤操作、排序操作、分组操作、集合操作、归纳操作、窗口操作)
List 概述
-
List 是一个不可变的有序集合,一旦创建就不能修改其内容,即不能添加、删除、更改元素
-
List 提供了丰富的操作函数来处理数据
一、转换操作
- 对 List 中的每个元素应用给定的转换函数
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]
- 对 List 中的每个元素应用给定的转换函数,同时提供元素的索引和值作为参数
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]
- 将嵌套 List 的所有元素合并到一个 List 中
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]
二、过滤操作
- 过滤出指定类型的元素
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]
- 过滤出满足条件的元素
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]
- 过滤掉为 null 的元素
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]
三、排序操作
- 对元素进行升序排序
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]
- 对元素进行降序排序
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]
- 对元素进行自定义升序排序
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]
四、分组操作
- 根据条件将元素分组,返回一个 Map,其中,键是分组条件的结果,值是对应的元素列表
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]}
- 根据条件将元素分组,分成两个 List,第一个 List 包含满足条件的元素,第二个 List 包含不满足条件的元素
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]
五、集合操作
-
并集:
+
操作符用于合并两个 List 的元素,允许重复 -
真并集:union 用于合并两个 List 的元素,返回 Set,自动去重
-
交集:intersect 返回两个 List 中都存在的元素,返回 Set
-
差集:
-
操作符返回 a 有但 b 没有的元素
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 - bprintln("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]
六、归纳操作
- 对 List 的元素进行累积计算
val numbers = listOf(1, 2, 3, 4)val sum = numbers.reduce { acc, i -> acc + i }println("sum: $sum")
# 输出结果sum: 10
- 对 List 的元素进行累积计算,可以自定义初始值
val numbers = listOf(1, 2, 3, 4)val product = numbers.fold(1) { acc, i -> acc + i }println("product: $product")
# 输出结果sum: 11
七、窗口操作
- 将 List 划分为多个窗口,每个窗口包含 size 个连续元素
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]]
- 将 List 划分为多个窗口,每个窗口包含 size 个连续元素,并对每个窗口应用处理函数并返回结果
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]