Kotlin Academy · บทเรียน

ซีเควนซ์เทียบกับคอลเลกชัน

แต่ละแบบเหมาะกับสถานการณ์ใด

บทเรียน 4 จาก 413 ขั้นตอน

ซีเควนซ์เทียบกับคอลเลกชัน เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน 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)
}

ตรวจสอบอย่างรวดเร็ว

ในสถานการณ์ใดที่ซีเควนซ์มีแนวโน้มทำงานได้เร็วกว่าคอลเลกชันมากที่สุด

ทบทวน

คอลเลกชันประเมินผลทันทีและเหมาะที่สุดกับข้อมูลขนาดเล็กและการเน้นความเข้าใจง่าย ส่วนซีเควนซ์ประเมินผลเมื่อจำเป็นและเหมาะที่สุดกับข้อมูลขนาดใหญ่ สายการดำเนินการยาว หรือผลลัพธ์บางส่วน เนื่องจากไม่สร้างลิสต์ระหว่างทางและหยุดก่อนครบได้ โปรดระวังการดำเนินการที่มีสถานะ ทั้งสองแบบใช้ส่วนติดต่อเดียวกัน จึงสลับใช้งานได้ง่าย บทเรียนซีเควนซ์จบลงเพียงเท่านี้

เริ่มต้นได้ฟรี

เรียนรู้ Kotlin ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

คำถามที่พบบ่อย

บทเรียน “ซีเควนซ์เทียบกับคอลเลกชัน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ซีเควนซ์เทียบกับคอลเลกชัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ซีเควนซ์เทียบกับคอลเลกชัน”

แต่ละแบบเหมาะกับสถานการณ์ใด คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ซีเควนซ์เทียบกับคอลเลกชัน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เหตุใดจึงใช้ซีเควนซ์
  2. การสร้างซีเควนซ์
  3. การดำเนินการแบบขี้เกียจ
  4. ซีเควนซ์เทียบกับคอลเลกชัน
← กลับไปที่ Kotlin Academy