Kotlin 数据容器 - 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 + bval 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]