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

map และ filter แบบ lazy

เชื่อมการแปลงแบบ lazy โดยไม่สร้างอาร์เรย์ระหว่างทาง

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

อาร์เรย์ระหว่างทาง

สายการทำงานแบบประเมินทันทีจะจัดสรรอาร์เรย์ใหม่ระหว่างทุกขั้นตอน การใช้ filter().map() กับอาร์เรย์ขนาดใหญ่จะสร้างอาร์เรย์เต็มสองชุด แม้ว่าคุณอาจต้องการเพียงไม่กี่สมาชิก

การจัดสรรแบบประเมินทันที

ในตัวอย่างนี้มีการสร้างอาร์เรย์ระหว่างทางสองชุด:

let nums = Array(1...6)
let result = nums
    .filter { $0 % 2 == 0 }  // builds [2, 4, 6]
    .map { $0 * 10 }         // builds [20, 40, 60]
print(result)  // [20, 40, 60]

การรวมขั้นตอนด้วย lazy

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

สายการทำงานแบบเลื่อนการประเมิน

ตรรกะเดียวกัน แต่อาร์เรย์ระหว่างทางเป็นศูนย์ชุด:

let nums = Array(1...6)
let result = nums.lazy
    .filter { $0 % 2 == 0 }
    .map { $0 * 10 }
print(Array(result))  // [20, 40, 60]

การไหลของข้อมูลทีละสมาชิก

การติดตามการทำงานแสดงให้เห็นการทำงานที่สลับกันไป แทนที่จะทำงานทีละระยะ:

let out = [1, 2, 3].lazy
    .filter { n -> Bool in print("filter \(n)"); return n > 1 }
    .map   { n -> Int  in print("map \(n)");    return n }
print(Array(out))  // filter 1, filter 2, map 2, filter 3, map 3 -> [2, 3]

การหยุดก่อนช่วยลดงาน

ใช้สายการทำงานแบบเลื่อนการประเมินร่วมกับ first(where:) เพื่อหยุดทันทีที่ทำได้:

let nums = Array(1...1_000_000)
let hit = nums.lazy.map { $0 + 1 }.first { $0 > 5 }
print(hit!)  // 6  -- only a handful of elements processed

lazy กับ prefix

รับเฉพาะผลลัพธ์สองสามรายการแรกจากการแปลงที่มีต้นทุนสูง:

let squares = (1...).lazy.map { $0 * $0 }
print(Array(squares.prefix(5)))  // [1, 4, 9, 16, 25]

การนับงานที่ถูกข้าม

ตัวนับจะแสดงให้เห็นว่ามีสมาชิกกี่ตัวที่ถูกประมวลผลจริง:

var transforms = 0
let result = Array(1...100).lazy
    .map { (n: Int) -> Int in transforms += 1; return n * 2 }
    .prefix(3)
_ = Array(result)
print(transforms)  // 3, not 100

compactMap แบบเลื่อนการประเมิน

compactMap ก็มีรูปแบบแบบเลื่อนการประเมินเช่นกัน:

let raw = ["1", "x", "3", "y", "5"]
let first = raw.lazy.compactMap { Int($0) }.first
print(first!)  // 1

การผสานหลายขั้นตอน

สายการประมวลผลที่รวมขั้นตอนยาว ๆ จะไม่จัดสรรหน่วยความจำจนกว่าจะสร้างผลลัพธ์จริง:

let r = Array(1...20).lazy
    .filter { $0 % 2 == 0 }
    .map { $0 * $0 }
    .filter { $0 > 50 }
print(Array(r))  // [64, 100, 144, 196, 256, 324, 400]

เมื่อการรวมขั้นตอนให้ประโยชน์มากที่สุด

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

let big = Array(1...10_000)
let sample = Array(big.lazy.filter { $0 % 1000 == 0 })
print(sample)  // [1000, 2000, ... 10000]

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

สายการทำงาน filter().map() แบบเลื่อนการประเมินหลีกเลี่ยงสิ่งใดที่แบบประเมินทันทีสร้างขึ้น

สรุป

คุณได้เรียนรู้สายการทำงานแบบเลื่อนการประเมินแล้ว:

  • สายการทำงานแบบประเมินทันทีจะจัดสรรอาร์เรย์ระหว่างทุกขั้นตอน
  • .lazy รวมขั้นตอนเข้าด้วยกัน โดยประมวลผลทีละสมาชิกและไม่มีข้อมูลระหว่างทาง
  • ทำงานเข้าคู่กันได้ดีกับ first(where:) และ prefix เพื่อหยุดก่อนถึงจุดสิ้นสุด
  • ให้ประโยชน์สูงสุดเมื่อแหล่งข้อมูลมีขนาดใหญ่แต่ใช้ข้อมูลเพียงบางส่วน

ถัดไป: ข้อแลกเปลี่ยนระหว่างการเลื่อนการประเมินกับการประเมินทันที

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

บทเรียน “map และ filter แบบ lazy” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “map และ filter แบบ lazy”

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

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

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

บทเรียน “map และ filter แบบ lazy” ใช้เวลานานแค่ไหน

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

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

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

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

  1. คุณสมบัติ lazy
  2. map และ filter แบบ lazy
  3. ข้อแลกเปลี่ยนระหว่าง lazy กับ eager
  4. การสร้างลำดับแบบ lazy ที่กำหนดเอง
← กลับไปที่ Swift Academy