filter、filterNot 与 partition
使用基于谓词的函数拆分和筛选元素。
filter、filterNot 与 partition 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。
选择操作
过滤会保留符合谓词的元素。filterNot 会保留不匹配(NOT)的元素。分区可以一次将集合拆分为两个列表。
基础过滤
filter { ... } 会返回一个新列表,其中只包含谓词为真的元素。
fun main() {
val nums = listOf(1, 2, 3, 4, 5, 6)
val evens = nums.filter { it % 2 == 0 }
println(evens) // [2, 4, 6]
}filterNot
filterNot { ... } 与之相反:保留谓词为假的元素。结果与反转谓词相同,但意图更清晰。
fun main() {
val nums = listOf(1, 2, 3, 4, 5, 6)
val odds = nums.filterNot { it % 2 == 0 }
println(odds) // [1, 3, 5]
}分区
partition 会返回一个二元组:匹配的元素在前,不匹配的元素在后。这样可以避免对数据进行两次遍历。
fun main() {
val nums = listOf(1, 2, 3, 4, 5, 6)
val (evens, odds) = nums.partition { it % 2 == 0 }
println("evens=$evens odds=$odds")
}使用数据类进行分区
一次遍历即可将记录列表拆分为两个组。
data class User(val name: String, val active: Boolean)
fun main() {
val users = listOf(User("Ada", true), User("Ben", false), User("Cal", true))
val (active, inactive) = users.partition { it.active }
println("active=${active.map { it.name }}")
println("inactive=${inactive.map { it.name }}")
}filterIndexed
谓词会同时接收索引和值——当位置很重要时非常有用。
fun main() {
val nums = listOf(10, 20, 30, 40, 50)
val every2nd = nums.filterIndexed { i, _ -> i % 2 == 0 }
println(every2nd) // [10, 30, 50]
}filterIsInstance
只保留特定类型的元素——其中会进行智能类型转换。
fun main() {
val mixed: List<Any> = listOf(1, "hello", 2.0, "world", 3)
val onlyStrings = mixed.filterIsInstance<String>()
println(onlyStrings) // [hello, world]
}filterNotNull
从可空元素列表中移除 null 条目——返回一个包含非空元素的列表。
fun main() {
val mixed: List<String?> = listOf("a", null, "b", null, "c")
val nonNull = mixed.filterNotNull()
println(nonNull) // [a, b, c]
}串联过滤与映射
组合 filter 和 map,构建选择与转换流水线。
data class Product(val name: String, val price: Double, val inStock: Boolean)
fun main() {
val products = listOf(
Product("Pen", 1.0, true),
Product("Book", 12.0, false),
Product("Lamp", 25.0, true)
)
val availableNames = products.filter { it.inStock }.map { it.name }
println(availableNames) // [Pen, Lamp]
}使用 filterNot 进行否定以提高清晰度
有时,filterNot { it.isActive } 比 filter { !it.isActive } 更易读。
data class Task(val title: String, val done: Boolean)
fun main() {
val tasks = listOf(Task("Email", true), Task("Lunch", false), Task("Code", true))
val pending = tasks.filterNot { it.done }
println(pending) // [Task(title=Lunch, done=false)]
}分区返回列表
partition 返回的 Pair 包含两个普通列表——您可以将它们解构,或通过 .first / .second 访问。
fun main() {
val nums = (1..10).toList()
val result = nums.partition { it > 5 }
println("above 5: ${result.first}")
println("below 6: ${result.second}")
}分区与两次过滤调用
如果两个子集都需要,partition 会更快——只需遍历一次,而不是两次。
fun main() {
val nums = (1..10).toList()
// Two passes:
val a = nums.filter { it > 5 }
val b = nums.filter { it <= 5 }
// One pass:
val (c, d) = nums.partition { it > 5 }
println("$a $b")
println("$c $d")
}快速检查
哪个函数可以在一次遍历中同时返回匹配和不匹配的元素(BOTH)?
回顾
过滤选择匹配项;filterNot选择不匹配项;分区在一次遍历中返回两组元素。使用 filterIsInstance 保留特定类型的元素,使用 filterNotNull 移除 null 值。将它们与 map 串联即可完成选择与转换。
用 AI 导师学习 Kotlin — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 51
- 课程
- 203
常见问题解答
「filter、filterNot 与 partition」课时是免费的吗?
是的 — 「filter、filterNot 与 partition」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。
「filter、filterNot 与 partition」这节课中我会学到什么?
使用基于谓词的函数拆分和筛选元素。 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Kotlin Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「filter、filterNot 与 partition」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Kotlin Academy 课中编写并运行代码吗?
能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- map 与 flatMap:转换每个元素
- filter、filterNot 与 partition
- fold、reduce 与 runningFold
- 串联处理流程并使用 Sequence 避免中间列表