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

การเชื่อมต่อไปป์ไลน์และหลีกเลี่ยงลิสต์ชั่วคราวด้วย Sequence

สร้างไปป์ไลน์หลายขั้นตอนและใช้ Sequence เพื่อประเมินผลแบบขี้เกียจ

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

ปัญหา: รายการระหว่างทาง

แต่ละการดำเนินการกับคอลเลกชัน (การกรอง การแปลง และอื่น ๆ) จะสร้างรายการใหม่ สำหรับคอลเลกชันขนาดใหญ่หรือการดำเนินการต่อกันที่ยาว วิธีนี้ใช้หน่วยความจำและเวลาโดยเปล่าประโยชน์

การประเมินแบบทันทีเทียบกับแบบประเมินเมื่อจำเป็น

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

การแปลงเป็นลำดับ

เรียก asSequence() เพื่อเปลี่ยนจากการประมวลผลแบบทันที (รายการ) เป็นการประมวลผลแบบประเมินเมื่อจำเป็น (ลำดับ)
val result = (1..1_000_000)
    .asSequence()
    .filter { it % 2 == 0 }
    .map { it * it }
    .take(5)
    .toList()
println(result)  // [4, 16, 36, 64, 100]

ลำดับประเมินเมื่อจำเป็น: ยังไม่ทำงานจนกว่าจะถึงการดำเนินการปลายทาง

จะยังไม่มีการคำนวณจนกว่าคุณจะเรียกตัวดำเนินการปลายทาง (toList, first, sum และอื่น ๆ)
val seq = generateSequence(1) { it + 1 }  // infinite!
    .filter { it % 3 == 0 }
    .map { it * it }
val first5 = seq.take(5).toList()
println(first5)  // [9, 36, 81, 144, 225]

generateSequence: ลำดับอนันต์

generateSequence สร้างลำดับอนันต์ที่ประเมินเมื่อจำเป็น
val fibonacci = generateSequence(Pair(0, 1)) { (a, b) -> Pair(b, a + b) }
    .map { it.first }
val first10 = fibonacci.take(10).toList()
println(first10)  // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

ตัวสร้างลำดับ

ตัวสร้าง sequence { } ที่ใช้ yield จะสร้างลำดับแบบกำหนดเองซึ่งประเมินเมื่อจำเป็น
val evens = sequence {
    var n = 0
    while (true) {
        yield(n)
        n += 2
    }
}
println(evens.take(5).toList())  // [0, 2, 4, 6, 8]

ควรใช้ลำดับเมื่อใด

ใช้ลำดับเมื่อคอลเลกชันมีขนาดใหญ่ (>1000 สมาชิก) เมื่อคุณใช้การดำเนินการหลายรายการต่อกัน และ/หรือเมื่อคุณต้องการผลลัพธ์เพียงบางส่วน

เมื่อใดไม่ควรใช้ลำดับ

สำหรับคอลเลกชันขนาดเล็ก (<100 สมาชิก) ลำดับจะเพิ่มภาระการทำงาน กลไกที่ใช้ตัววนซ้ำจะช้ากว่าสำหรับการดำเนินการต่อกันสั้น ๆ
// Overkill for small list:
listOf(1, 2, 3).asSequence().map { it * 2 }.toList()
// Just use:
listOf(1, 2, 3).map { it * 2 }

การดำเนินการปลายทางของลำดับ

การดำเนินการปลายทางจะเริ่มการประมวลผล ตัวอย่างที่พบบ่อย ได้แก่ toList(), first(), last(), การนับ(), sum(), การตรวจว่ามีรายการใดตรงเงื่อนไข(), การตรวจว่าสมาชิกทั้งหมดตรงเงื่อนไข() และการตรวจว่าไม่มีสมาชิกใดตรงเงื่อนไข()
val s = (1..100).asSequence().filter { it % 7 == 0 }
println(s.first())          // 7
println(s.count())          // 14
println(s.sum())            // 728

การดำเนินการแบบมีสถานะเทียบกับไร้สถานะ

การดำเนินการกับลำดับบางอย่างมีสถานะ (เช่น การเรียงลำดับและการตัดค่าซ้ำ) — ต้องเห็นสมาชิกทั้งหมดก่อนจึงจะสร้างผลลัพธ์ได้ ซึ่งทำให้การประเมินเมื่อจำเป็นหยุดลง
val s = (1..10).asSequence()
    .filter { it > 3 }   // stateless: lazy
    .sorted()            // stateful: must see all elements
    .take(3).toList()
println(s)  // [4, 5, 6]

constrainOnce: ความปลอดภัยในการวนซ้ำครั้งเดียว

ใช้ constrainOnce() เพื่อให้ลำดับแสดงข้อผิดพลาดหากถูกวนซ้ำหลายครั้ง — มีประโยชน์สำหรับกระแสข้อมูล
val seq = generateSequence(1) { if (it < 5) it + 1 else null }
    .constrainOnce()
val first = seq.toList()   // OK
// val second = seq.toList()  // IllegalStateException!

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ลำดับจะเริ่มประมวลผลสมาชิกเมื่อใด

สรุปทบทวน

ลำดับจะประเมินเมื่อจำเป็น — จะยังไม่ทำงานจนกว่าจะถึงการดำเนินการปลายทาง ใช้ asSequence() กับคอลเลกชันขนาดใหญ่ที่มีการดำเนินการหลายรายการต่อกัน generateSequence และ sequence { } จะสร้างกระแสข้อมูลอนันต์ที่ประเมินเมื่อจำเป็น การดำเนินการปลายทางจะเริ่มการประมวลผล

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

บทเรียน “การเชื่อมต่อไปป์ไลน์และหลีกเลี่ยงลิสต์ชั่วคราวด้วย Sequence” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การเชื่อมต่อไปป์ไลน์และหลีกเลี่ยงลิสต์ชั่วคราวด้วย Sequence”

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

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

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

บทเรียน “การเชื่อมต่อไปป์ไลน์และหลีกเลี่ยงลิสต์ชั่วคราวด้วย Sequence” ใช้เวลานานแค่ไหน

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

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

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

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

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