0Pricing
Scala for Backend Engineering & Functional Programming · บทเรียน

การดำเนินการเชิงฟังก์ชันกับคอลเลกชัน

เชี่ยวชาญการดำเนินการเชิงฟังก์ชันทั่วไป เช่น 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เจาะลึกคอลเลกชันแบบไม่เปลี่ยนรูป
  2. การดำเนินการเชิงฟังก์ชันกับคอลเลกชัน
  3. Option, Try, Either สำหรับข้อผิดพลาด
← กลับไปที่ Scala for Backend Engineering & Functional Programming