大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
集合 API
Kotlin 标准库对集合提供了丰富的扩展函数:filter、map、fold、groupBy 等链式调用,比 Java Stream 更简洁,且区分可变与不可变集合。
学习目标
- 掌握
List、Set、Map的创建与基本操作 - 熟练使用
filter、map、fold、groupBy等函数式 API - 理解只读集合与可变集合的区别
创建与基本操作
fun main() {
// 只读 List
val slugs = listOf("kt-intro", "kt-syntax", "kt-control")
println(slugs[0])
println(slugs.size)
// 可变 List
val mutable = mutableListOf<String>()
mutable.add("kt-functions")
mutable.removeAt(0)
// Set 去重
val tags = setOf("kotlin", "jvm", "kotlin")
println(tags) // [kotlin, jvm]
// Map
val lessonCount = mapOf(
"kotlin-essentials" to 12,
"java-fundamentals" to 14
)
println(lessonCount["kotlin-essentials"])
println(lessonCount.getOrDefault("missing", 0))
}
listOf/setOf/mapOf 返回只读视图;mutableListOf 等可修改。
函数式变换
data class Lesson(val slug: String, val title: String, val order: Int)
fun main() {
val lessons = listOf(
Lesson("kt-intro", "Kotlin 是什么", 1),
Lesson("kt-syntax", "基础语法", 2),
Lesson("kt-control", "控制流", 3),
Lesson("kt-functions", "函数与 Lambda", 4)
)
val titles = lessons
.filter { it.order <= 3 }
.map { it.title }
println(titles)
val byPrefix = lessons.groupBy { it.slug.substringBefore("-") }
println(byPrefix.keys)
val totalOrders = lessons.fold(0) { acc, l -> acc + l.order }
println("序号总和: $totalOrders")
val sorted = lessons.sortedBy { it.order }
println(sorted.map { "${it.order}. ${it.title}" })
}
链式调用可读性高;groupBy 按 key 分组,fold 聚合。
遍历与解构
fun main() {
val counts = mapOf("kt-intro" to 1, "kt-syntax" to 2)
for ((slug, order) in counts) {
println("$slug -> $order")
}
val slugs = listOf("a", "b", "c")
slugs.forEachIndexed { index, slug ->
println("${index + 1}. $slug")
}
// 序列:惰性求值,适合大集合
val result = (1..1_000_000)
.asSequence()
.filter { it % 2 == 0 }
.take(5)
.toList()
println(result)
}
Sequence 类似 Java Stream 的 lazy 模式,中间操作不立即执行。
与 Java 对照
| Kotlin | Java |
|---|---|
listOf(1, 2, 3) | List.of(1, 2, 3) |
slugs.filter { ... } | slugs.stream().filter(...).toList() |
lessons.groupBy { it.slug } | Collectors.groupingBy |
map.getOrDefault(k, 0) | map.getOrDefault(k, 0) |
listOf 只读 | Collections.unmodifiableList |
练习
- Map 存 slug→title,按 key 排序后打印
- 用
groupBy按 slug 前缀分组 lesson 列表 - 对比 Java Stream 与 Kotlin 集合链式调用的写法
小结
List/Set/Map + filter/map/fold 是 Kotlin 日常数据处理核心。 下一课类与 OOP。见 kotlin-essentials。