การดำเนินการเชิงฟังก์ชันกับคอลเลกชัน
เชี่ยวชาญการดำเนินการเชิงฟังก์ชันทั่วไป เช่น map, filter, fold และ reduce เพื่อแปลงข้อมูล
การดำเนินการเชิงฟังก์ชันกับคอลเลกชัน เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 3 บทเรียน
การดำเนินการเชิงฟังก์ชัน: เหตุใดจึงควรใช้
การดำเนินการเชิงฟังก์ชันกับคอลเลกชันช่วยให้คุณแปลงและรวมข้อมูลได้โดยไม่เปลี่ยนแปลงคอลเลกชันเดิม แนวทางนี้ส่งเสริมการไม่เปลี่ยนแปลงข้อมูล และทำให้โค้ดอ่านและทดสอบได้ง่ายขึ้น
เราจะสำรวจการดำเนินการสำคัญ เช่น map, filter, reduce และ fold
แปลงข้อมูลด้วย `map`
การดำเนินการ map จะใช้ฟังก์ชันกับสมาชิกแต่ละตัวของคอลเลกชัน แล้วส่งคืนคอลเลกชันใหม่ที่มีผลลัพธ์จากการแปลง สมาชิกในคอลเลกชันเดิมจะยังคงไม่เปลี่ยนแปลง
ลองเรียกใช้ตัวอย่างนี้:
object Main {
def main(args: Array[String]): Unit = {
val numbers = List(1, 2, 3, 4)
val doubled = numbers.map(n => n * 2)
println(s"Original: $numbers")
println(s"Doubled: $doubled")
}
}`map` กับชนิดข้อมูลที่แตกต่างกัน
map มีความยืดหยุ่นสูงมาก คุณสามารถแปลงสมาชิกให้เป็นชนิดข้อมูลที่แตกต่างไปโดยสิ้นเชิงได้ ในที่นี้ เราจะแปลงตัวเลขเป็นสตริง หรือหาความยาวของสตริง
โปรดสังเกตว่าผลลัพธ์เป็น List[Int] แม้ว่าอินพุตจะเป็น List[String] ก็ตาม
object Main {
def main(args: Array[String]): Unit = {
val names = List("Alice", "Bob", "Charlie")
val lengths = names.map(name => name.length)
println(s"Names: $names")
println(s"Lengths: $lengths")
}
}เลือกข้อมูลด้วย `filter`
การดำเนินการ filter จะสร้างคอลเลกชันใหม่ที่มีเฉพาะสมาชิกซึ่งตรงตามเงื่อนไขที่กำหนด (ฟังก์ชันเพรดิเคต) โดยจะ "กรอง" สมาชิกที่ไม่ต้องการออก
มาลองค้นหาตัวเลขคู่กัน:
object Main {
def main(args: Array[String]): Unit = {
val numbers = List(1, 2, 3, 4, 5, 6)
val evens = numbers.filter(n => n % 2 == 0)
println(s"Original: $numbers")
println(s"Evens: $evens")
}
}ตัวอย่างเพิ่มเติมของ `filter`
คุณสามารถใช้นิพจน์บูลีนใดก็ได้เป็นเงื่อนไขการกรอง มาลองกรองรายการคำเพื่อเก็บไว้เฉพาะคำที่มีความยาวมากกว่า 4 อักขระ
object Main {
def main(args: Array[String]): Unit = {
val words = List("apple", "cat", "banana", "dog", "elephant")
val longWords = words.filter(w => w.length > 4)
println(s"Words: $words")
println(s"Long words: $longWords")
}
}รวมข้อมูลด้วย `reduce`
การดำเนินการ reduce จะรวมสมาชิกทั้งหมดในคอลเลกชันให้เป็นผลลัพธ์เดียว โดยรับการดำเนินการแบบไบนารี (ฟังก์ชันที่รับอาร์กิวเมนต์สองตัวและส่งคืนค่าหนึ่งตัว) แล้วนำไปใช้สะสมผลลัพธ์ไปเรื่อย ๆ
ในตัวอย่างนี้ เราจะหาผลรวมของสมาชิกทั้งหมด:
object Main {
def main(args: Array[String]): Unit = {
val numbers = List(1, 2, 3, 4)
val sum = numbers.reduce((a, b) => a + b)
println(s"Numbers: $numbers")
println(s"Sum: $sum")
}
}`reduce` สำหรับผลคูณและค่าสูงสุด
reduce สามารถใช้คำนวณค่ารวมได้หลายรูปแบบ เราสามารถคำนวณผลคูณของตัวเลขหรือค้นหาค่าสูงสุดได้
หมายเหตุ: reduce จะทำให้เกิดข้อผิดพลาดเมื่อใช้กับคอลเลกชันว่าง
object Main {
def main(args: Array[String]): Unit = {
val numbers = List(1, 5, 2, 8)
val product = numbers.reduce((a, b) => a * b)
val maxNum = numbers.reduce((a, b) => if (a > b) a else b)
println(s"Numbers: $numbers")
println(s"Product: $product")
println(s"Max: $maxNum")
}
}พลังของค่าเริ่มต้นใน `fold`
fold คล้ายกับ reduce แต่มีความแตกต่างสำคัญคือ รับค่าเริ่มต้น (เรียกอีกอย่างว่า "ตัวสะสม") ทำให้ใช้งานกับคอลเลกชันว่างได้อย่างปลอดภัย และช่วยให้ชนิดของผลลัพธ์แตกต่างจากชนิดของสมาชิกได้
มาหาผลรวมของตัวเลขโดยเริ่มต้นจาก 10 กัน:
object Main {
def main(args: Array[String]): Unit = {
val numbers = List(1, 2, 3)
// foldLeft(initialValue)(operation)
val sumWithInitial = numbers.foldLeft(10)((acc, n) => acc + n)
println(s"Numbers: $numbers")
println(s"Sum (starting from 10): $sumWithInitial")
}
}ทิศทาง: `foldLeft` เทียบกับ `foldRight`
Scala มี foldLeft และ foldRight ทั้งสองแบบแตกต่างกันที่ลำดับการประมวลผลสมาชิกและวิธีส่งต่อตัวสะสม
foldLeft(initial)(op): ประมวลผลจากซ้ายไปขวาfoldRight(initial)(op): ประมวลผลจากขวาไปซ้าย
สำหรับการดำเนินการอย่างการต่อสตริง ทิศทางมีความสำคัญ
object Main {
def main(args: Array[String]): Unit = {
val chars = List('a', 'b', 'c')
val leftFold = chars.foldLeft("")((acc, c) => acc + c)
val rightFold = chars.foldRight("")((c, acc) => acc + c)
println(s"Chars: $chars")
println(s"foldLeft: $leftFold") // Output: abc
println(s"foldRight: $rightFold") // Output: abc (due to string append order)
// Example where order matters: (acc, char) => char + acc
val rightFoldReversed = chars.foldRight("")((c, acc) => c + acc)
println(s"foldRight (char + acc): $rightFoldReversed") // Output: abc
// A common example where order matters is for operations like subtraction or division, but string concatenation also shows it.
}
}ตรวจสอบการดำเนินการเชิงฟังก์ชัน
พิจารณาข้อมูลโค้ด Scala ต่อไปนี้:
val data = List(10, 20, 30, 40)
val result1 = data.map(x => x / 10)
val result2 = data.filter(x => x > 25)
val result3 = data.reduce((a, b) => a + b)
ข้อความใดต่อไปนี้เป็นจริงเกี่ยวกับผลลัพธ์
สรุป: พลังของการดำเนินการเชิงฟังก์ชัน
คุณได้เรียนรู้การดำเนินการเชิงฟังก์ชันที่สำคัญแล้ว
mapแปลงสมาชิกแต่ละตัวfilterเลือกสมาชิกตามเงื่อนไขreduceรวมสมาชิกให้เป็นผลลัพธ์เดียว (ต้องใช้กับคอลเลกชันที่ไม่ว่าง)foldรวมสมาชิกโดยมีค่าเริ่มต้น (ปลอดภัยสำหรับคอลเลกชันว่าง)
การดำเนินการเหล่านี้เป็นพื้นฐานสำคัญในการเขียนโค้ด Scala ที่กระชับ ไม่เปลี่ยนแปลงข้อมูล และมีประสิทธิภาพ ต่อไปเราจะสำรวจการจัดการข้อผิดพลาดที่มีประสิทธิภาพโดยใช้ Option, Try และ Either
คำถามที่พบบ่อย
บทเรียน “การดำเนินการเชิงฟังก์ชันกับคอลเลกชัน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การดำเนินการเชิงฟังก์ชันกับคอลเลกชัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การดำเนินการเชิงฟังก์ชันกับคอลเลกชัน”
เชี่ยวชาญการดำเนินการเชิงฟังก์ชันทั่วไป เช่น map, filter, fold และ reduce เพื่อแปลงข้อมูล คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน
บทเรียน “การดำเนินการเชิงฟังก์ชันกับคอลเลกชัน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม
ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เจาะลึกคอลเลกชันแบบไม่เปลี่ยนรูป
- การดำเนินการเชิงฟังก์ชันกับคอลเลกชัน
- Option, Try, Either สำหรับข้อผิดพลาด