序列与集合
了解各自的优势
序列与集合 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。
序列与集合
序列和集合都提供相同的函数式操作,但求值方式不同。了解各自更适用的场景,可以帮助您编写高效且易读的代码。
立即求值集合回顾
集合是立即求值的:每个操作都会处理所有元素,并立即生成一个新的集合。这种方式对于少量数据来说简单而快速。
fun main() {
val result = listOf(1, 2, 3).map { it + 1 }.filter { it > 2 }
println(result)
}惰性序列回顾
序列是惰性的:操作会构建一个流水线,只有在被消费时才会逐个处理元素,从而避免创建中间集合。
fun main() {
val result = listOf(1, 2, 3).asSequence().map { it + 1 }.filter { it > 2 }.toList()
println(result)
}集合更有优势的场景
对于小型集合和较短的操作链,集合通常更快、更清晰。序列会为每个元素增加额外开销(调用迭代器),对于极少量数据,这种开销可能超过序列带来的收益。
序列更有优势的场景
当数据量很大、操作链很长,或者您只需要部分结果(第一个匹配项或前 N 个元素)时,序列更有优势。它们不会创建庞大的中间列表,并且可以提前停止。
fun main() {
val firstEvenSquare = (1..1000000).asSequence()
.map { it * it }
.first { it % 2 == 0 }
println(firstEvenSquare)
}衡量差异
这个大范围示例展示了序列如何避免生成包含一百万个元素的中间列表,而立即求值版本会创建该列表。
fun main() {
val seqResult = (1..1000).asSequence()
.filter { it % 2 == 0 }
.map { it * 3 }
.take(3)
.toList()
println(seqResult)
}内存占用
立即求值的操作链会同时将每个中间列表保留在内存中。序列只保留正在流经流水线的当前元素,因此对于较长的流水线,峰值内存占用仍然很低。
提前终止处理的优势
如果终止操作可以提前完成(first、find、any),序列会跳过剩余元素,而立即求值的集合早已处理完所有元素。
fun main() {
val found = (1..100).asSequence()
.map { println("checking $it"); it }
.any { it == 3 }
println("Found: $found")
}注意有状态操作
sorted、distinct 和 groupBy 等操作需要所有元素,因此会削弱惰性。由这些操作占主导的流水线可能无法从序列中获益。
实用指导原则
经验法则是:为了清晰易懂,默认使用集合。当您要处理大量数据、串联许多操作,或者只需要结果的一小部分时,再切换到序列。如果性能至关重要,请务必进行测量。
相同的应用编程接口,不同的执行引擎
由于两者共享相同的操作名称,通常只需添加或移除 asSequence() 以及终止操作 toList(),就可以完成切换。这使得尝试不同性能表现的风险很低。
fun main() {
val data = listOf(1, 2, 3, 4, 5)
val asList = data.map { it * 2 }.filter { it > 4 }
val asSeq = data.asSequence().map { it * 2 }.filter { it > 4 }.toList()
println(asList == asSeq)
}快速检查
在哪种情况下,序列最有可能优于集合?
回顾
集合是立即求值的,适合少量数据和追求清晰性的场景;序列是惰性的,凭借不创建中间列表和提前终止处理,适合大量数据、较长操作链或部分结果。请注意有状态操作。两者共享相同的应用编程接口,因此切换很容易。序列课程到此结束。
常见问题解答
「序列与集合」课时是免费的吗?
是的 — 「序列与集合」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。
「序列与集合」这节课中我会学到什么?
了解各自的优势 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Kotlin Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「序列与集合」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Kotlin Academy 课中编写并运行代码吗?
能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。