Kotlin 集合操作 #

一、过滤操作 #

1.1 filter #

kotlin
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

val evens = numbers.filter { it % 2 == 0 }
// [2, 4, 6, 8, 10]

val greaterThan5 = numbers.filter { it > 5 }
// [6, 7, 8, 9, 10]

1.2 filterNot #

kotlin
val numbers = listOf(1, 2, 3, 4, 5)

val result = numbers.filterNot { it % 2 == 0 }
// [1, 3, 5]

1.3 filterIndexed #

kotlin
val list = listOf("a", "b", "c", "d", "e")

val result = list.filterIndexed { index, _ -> index % 2 == 0 }
// [a, c, e]

1.4 filterNotNull #

kotlin
val list = listOf(1, null, 2, null, 3)

val result = list.filterNotNull()
// [1, 2, 3]

1.5 filterIsInstance #

kotlin
val list: List<Any> = listOf(1, "a", 2, "b", 3)

val strings = list.filterIsInstance<String>()
// [a, b]

val ints = list.filterIsInstance<Int>()
// [1, 2, 3]

1.6 take / drop #

kotlin
val list = listOf(1, 2, 3, 4, 5)

list.take(3)           // [1, 2, 3]
list.takeLast(3)       // [3, 4, 5]
list.drop(2)           // [3, 4, 5]
list.dropLast(2)       // [1, 2, 3]

// 条件版本
list.takeWhile { it < 4 }    // [1, 2, 3]
list.dropWhile { it < 3 }    // [3, 4, 5]

二、映射操作 #

2.1 map #

kotlin
val numbers = listOf(1, 2, 3, 4, 5)

val doubled = numbers.map { it * 2 }
// [2, 4, 6, 8, 10]

val strings = numbers.map { "Number: $it" }
// [Number: 1, Number: 2, ...]

2.2 mapIndexed #

kotlin
val list = listOf("a", "b", "c")

val result = list.mapIndexed { index, value -> "$index: $value" }
// [0: a, 1: b, 2: c]

2.3 mapNotNull #

kotlin
val list = listOf(1, 2, 3, 4, 5)

val result = list.mapNotNull { 
    if (it > 2) it * 2 else null 
}
// [6, 8, 10]

2.4 flatMap #

kotlin
val lists = listOf(listOf(1, 2), listOf(3, 4), listOf(5, 6))

val result = lists.flatMap { it }
// [1, 2, 3, 4, 5, 6]

val words = listOf("Hello", "World")
val chars = words.flatMap { it.toList() }
// [H, e, l, l, o, W, o, r, l, d]

2.5 associate #

kotlin
val list = listOf("a", "bb", "ccc")

val map = list.associateWith { it.length }
// {a=1, bb=2, ccc=3}

val map2 = list.associateBy { it.length }
// {1=a, 2=bb, 3=ccc}

val map3 = list.associate { it to it.length }
// {a=1, bb=2, ccc=3}

三、排序操作 #

3.1 sorted #

kotlin
val numbers = listOf(3, 1, 4, 1, 5, 9, 2, 6)

val sorted = numbers.sorted()
// [1, 1, 2, 3, 4, 5, 6, 9]

val sortedDesc = numbers.sortedDescending()
// [9, 6, 5, 4, 3, 2, 1, 1]

3.2 sortedBy #

kotlin
data class Person(val name: String, val age: Int)

val people = listOf(
    Person("Bob", 30),
    Person("Alice", 25),
    Person("Charlie", 35)
)

val byAge = people.sortedBy { it.age }
// [Person(Alice, 25), Person(Bob, 30), Person(Charlie, 35)]

val byName = people.sortedBy { it.name }
// [Person(Alice, 25), Person(Bob, 30), Person(Charlie, 35)]

3.3 sortedWith #

kotlin
val people = listOf(
    Person("Bob", 30),
    Person("Alice", 25),
    Person("Charlie", 25)
)

val result = people.sortedWith(
    compareBy({ it.age }, { it.name })
)
// 先按年龄排序,年龄相同按名字排序

3.4 reversed / shuffle #

kotlin
val list = listOf(1, 2, 3, 4, 5)

list.reversed()        // [5, 4, 3, 2, 1]
list.shuffled()        // 随机打乱

四、分组操作 #

4.1 groupBy #

kotlin
data class Person(val name: String, val age: Int)

val people = listOf(
    Person("Alice", 25),
    Person("Bob", 30),
    Person("Charlie", 25),
    Person("David", 30)
)

val byAge = people.groupBy { it.age }
// {25=[Alice, Charlie], 30=[Bob, David]}

val namesByAge = people.groupBy({ it.age }, { it.name })
// {25=[Alice, Charlie], 30=[Bob, David]}

4.2 groupingBy #

kotlin
val words = listOf("apple", "banana", "cherry", "date")

val countByLength = words.groupingBy { it.length }.eachCount()
// {5=1, 6=2, 4=1}

4.3 chunked #

kotlin
val list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

val chunks = list.chunked(3)
// [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

4.4 partition #

kotlin
val numbers = listOf(1, 2, 3, 4, 5, 6)

val (evens, odds) = numbers.partition { it % 2 == 0 }
// evens = [2, 4, 6]
// odds = [1, 3, 5]

五、聚合操作 #

5.1 reduce #

kotlin
val numbers = listOf(1, 2, 3, 4, 5)

val sum = numbers.reduce { acc, n -> acc + n }
// 15

val product = numbers.reduce { acc, n -> acc * n }
// 120

5.2 fold #

kotlin
val numbers = listOf(1, 2, 3, 4, 5)

val sum = numbers.fold(0) { acc, n -> acc + n }
// 15

val sumWithInitial = numbers.fold(10) { acc, n -> acc + n }
// 25

5.3 统计函数 #

kotlin
val numbers = listOf(1, 2, 3, 4, 5)

numbers.sum()          // 15
numbers.average()      // 3.0
numbers.maxOrNull()    // 5
numbers.minOrNull()    // 1
numbers.count()        // 5
numbers.count { it > 3 }  // 2

5.4 sumBy #

kotlin
data class Product(val name: String, val price: Double)

val products = listOf(
    Product("A", 10.0),
    Product("B", 20.0),
    Product("C", 30.0)
)

val total = products.sumOf { it.price }
// 60.0

六、查找操作 #

6.1 find #

kotlin
val numbers = listOf(1, 2, 3, 4, 5)

numbers.find { it > 3 }        // 4
numbers.findLast { it < 4 }    // 3
numbers.findOrNull { it > 10 } // null

6.2 any / all / none #

kotlin
val numbers = listOf(1, 2, 3, 4, 5)

numbers.any { it > 3 }     // true
numbers.all { it > 0 }     // true
numbers.none { it < 0 }    // true

6.3 indexOf #

kotlin
val list = listOf(1, 2, 3, 2, 4)

list.indexOf(2)            // 1
list.lastIndexOf(2)        // 3
list.indexOfFirst { it > 2 }  // 2
list.indexOfLast { it < 4 }   // 3

七、去重操作 #

7.1 distinct #

kotlin
val list = listOf(1, 2, 2, 3, 3, 3, 4)

val unique = list.distinct()
// [1, 2, 3, 4]

7.2 distinctBy #

kotlin
data class Person(val name: String, val age: Int)

val people = listOf(
    Person("Alice", 25),
    Person("Bob", 25),
    Person("Charlie", 30)
)

val byAge = people.distinctBy { it.age }
// [Person(Alice, 25), Person(Charlie, 30)]

八、合并操作 #

8.1 zip #

kotlin
val names = listOf("Alice", "Bob", "Charlie")
val ages = listOf(25, 30, 35)

val pairs = names.zip(ages)
// [(Alice, 25), (Bob, 30), (Charlie, 35)]

val maps = names.zip(ages) { name, age -> "$name: $age" }
// [Alice: 25, Bob: 30, Charlie: 35]

8.2 unzip #

kotlin
val pairs = listOf("a" to 1, "b" to 2, "c" to 3)

val (keys, values) = pairs.unzip()
// keys = [a, b, c]
// values = [1, 2, 3]

8.3 merge #

kotlin
val map1 = mapOf("a" to 1, "b" to 2)
val map2 = mapOf("b" to 3, "c" to 4)

val merged = map1 + map2
// {a=1, b=3, c=4}

九、实战示例 #

9.1 数据处理管道 #

kotlin
data class Order(val id: Int, val amount: Double, val status: String)

val orders = listOf(
    Order(1, 100.0, "completed"),
    Order(2, 50.0, "pending"),
    Order(3, 200.0, "completed"),
    Order(4, 75.0, "cancelled")
)

val totalCompleted = orders
    .filter { it.status == "completed" }
    .map { it.amount }
    .sum()
// 300.0

9.2 复杂分组统计 #

kotlin
data class Sale(val product: String, val amount: Double, val region: String)

val sales = listOf(
    Sale("A", 100.0, "East"),
    Sale("B", 200.0, "West"),
    Sale("A", 150.0, "East"),
    Sale("B", 250.0, "West")
)

val byProduct = sales
    .groupBy { it.product }
    .mapValues { (_, list) -> list.sumOf { it.amount } }
// {A=250.0, B=450.0}

十、总结 #

集合操作分类:

类型 操作
过滤 filter, take, drop
映射 map, flatMap, associate
排序 sorted, sortedBy, reversed
分组 groupBy, chunked, partition
聚合 reduce, fold, sum, average
查找 find, any, all, indexOf

下一步,让我们学习 序列

最后更新:2026-03-27