0Pricing
Kotlin Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. map และ flatMap: แปลงสมาชิกทุกตัว
  2. filter, filterNot และ partition
  3. fold, reduce และ runningFold
  4. การเชื่อมต่อไปป์ไลน์และหลีกเลี่ยงลิสต์ชั่วคราวด้วย Sequence
← กลับไปที่ Kotlin Academy