filter, filterNot และ partition
แบ่งและเลือกสมาชิกด้วยฟังก์ชันที่อาศัย predicate
filter, filterNot และ partition เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
การดำเนินการคัดเลือก
การกรอง จะเก็บสมาชิกที่ตรงกับเงื่อนไข filterNot จะเก็บสมาชิกที่ไม่ตรงกับเงื่อนไข และ การแบ่งส่วน จะแยกคอลเลกชันออกเป็นสองรายการพร้อมกัน
การกรองพื้นฐาน
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 คืนค่า Pair โดยสมาชิกที่ตรงเงื่อนไขจะอยู่ก่อน และสมาชิกที่ไม่ตรงเงื่อนไขจะอยู่ทีหลัง จึงไม่ต้องวนดูข้อมูลสองรอบ
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
นำรายการที่เป็นค่าว่างออกจากรายการของค่าที่อาจเป็นค่าว่าง — คืนรายการของสมาชิกที่ไม่เป็นค่าว่าง
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)]
}การแบ่งส่วนคืนรายการ
Pair จาก partition ประกอบด้วยรายการปกติสองรายการ — ใช้การแยกค่าเหล่านั้นหรือเข้าถึงผ่าน .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")
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
ฟังก์ชันใดคืนทั้งสมาชิกที่ตรงและไม่ตรงเงื่อนไขในรอบเดียว
สรุปทบทวน
การกรอง เลือกสมาชิกที่ตรงเงื่อนไข filterNot เลือกสมาชิกที่ไม่ตรงเงื่อนไข และ การแบ่งส่วน คืนทั้งสองกลุ่มในการวนดูเพียงรอบเดียว ใช้ filterIsInstance เพื่อเก็บสมาชิกตามชนิดข้อมูล และใช้ filterNotNull เพื่อตัดค่าว่างออก เชื่อมต่อกับ map สำหรับการคัดเลือกและแปลงข้อมูล
คำถามที่พบบ่อย
บทเรียน “filter, filterNot และ partition” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “filter, filterNot และ partition” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “filter, filterNot และ partition”
แบ่งและเลือกสมาชิกด้วยฟังก์ชันที่อาศัย predicate คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “filter, filterNot และ partition” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- map และ flatMap: แปลงสมาชิกทุกตัว
- filter, filterNot และ partition
- fold, reduce และ runningFold
- การเชื่อมต่อไปป์ไลน์และหลีกเลี่ยงลิสต์ชั่วคราวด้วย Sequence