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 processedlazy กับ 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 100compactMap แบบเลื่อนการประเมิน
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คุณสมบัติ lazy
- map และ filter แบบ lazy
- ข้อแลกเปลี่ยนระหว่าง lazy กับ eager
- การสร้างลำดับแบบ lazy ที่กำหนดเอง