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

Option ใน for-comprehension

เชื่อมต่อออบเจ็กต์ Option

Option ใน for-comprehension เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

การเชื่อมออปชันอย่างเป็นระเบียบ

การเรียก flatMap และ map หลายครั้งต่อกันอาจอ่านได้ยาก for-comprehension ของ Scala จึงมีรูปแบบไวยากรณ์ที่อ่านง่ายกว่าแต่ให้ผลแบบเดียวกัน

นี่คือรูปแบบย่อทางไวยากรณ์ที่คอมไพเลอร์จะแปลงกลับเป็นการเรียก flatMap และ map

for-comprehension พื้นฐาน

ภายใน for { ... } yield ... แต่ละ x <- option จะดึงค่าออกมาหากมีค่าอยู่ ส่วน yield จะสร้างผลลัพธ์สุดท้าย

หากออปชันทุกตัวเป็น Some คุณจะได้ Some ที่บรรจุผลลัพธ์นั้น

object Main {
  def main(args: Array[String]): Unit = {
    val a: Option[Int] = Some(3)
    val b: Option[Int] = Some(4)
    val sum = for {
      x <- a
      y <- b
    } yield x + y
    println(sum)
  }
}

การหยุดทำงานเมื่อเป็น None

หากตัวสร้างใดเป็น None ผลลัพธ์ของ for-comprehension ทั้งหมดจะเป็น None และขั้นตอนที่เหลือจะถูกข้าม

นี่คือการหยุดทำงานแบบเดียวกับที่ flatMap ให้ไว้ แต่มีรูปแบบที่อ่านง่ายกว่า

object Main {
  def main(args: Array[String]): Unit = {
    val a: Option[Int] = Some(3)
    val b: Option[Int] = None
    val sum = for {
      x <- a
      y <- b
    } yield x + y
    println(sum)
  }
}

การแปลงกลับเป็นรูปแบบเดิม

คอมไพเลอร์จะแปลง for-comprehension กลับเป็น flatMap และ map โค้ดสองส่วนนี้จึงให้ผลเทียบเท่ากัน

การเข้าใจเรื่องนี้ช่วยให้คุณคาดเดาชนิดของผลลัพธ์ได้

object Main {
  def main(args: Array[String]): Unit = {
    val a: Option[Int] = Some(3)
    val b: Option[Int] = Some(4)
    val viaFor = for { x <- a; y <- b } yield x + y
    val viaFlatMap = a.flatMap(x => b.map(y => x + y))
    println(viaFor)
    println(viaFlatMap)
  }
}

การใช้ค่าก่อนหน้า

ตัวสร้างที่อยู่ภายหลังสามารถอ้างอิงค่าที่ผูกไว้ก่อนหน้าได้ ทำให้แต่ละขั้นตอนขึ้นอยู่กับขั้นตอนก่อนหน้าได้

object Main {
  def main(args: Array[String]): Unit = {
    val base: Option[Int] = Some(10)
    val result = for {
      x <- base
      y <- Some(x * 2)
    } yield x + y
    println(result)
  }
}

การผูกค่าระหว่างทาง

คุณสามารถสร้างค่าธรรมดาภายใน for-comprehension ด้วย = โดยไม่ต้องใช้ลูกศร วิธีนี้เหมาะสำหรับการคำนวณค่าระหว่างทาง

object Main {
  def main(args: Array[String]): Unit = {
    val a: Option[Int] = Some(6)
    val result = for {
      x <- a
      doubled = x * 2
    } yield doubled + 1
    println(result)
  }
}

เงื่อนไขกรองด้วย if

for-comprehension สามารถมีตัวกรอง if ได้ หากเงื่อนไขไม่เป็นจริง ผลลัพธ์จะกลายเป็น None

object Main {
  def main(args: Array[String]): Unit = {
    val a: Option[Int] = Some(8)
    val even = for {
      x <- a
      if x % 2 == 0
    } yield x
    println(even)
    val b: Option[Int] = Some(7)
    println(for { x <- b if x % 2 == 0 } yield x)
  }
}

การรวมการค้นหาหลายรายการ

การใช้งานทั่วไปคือค้นหาหลายคีย์ แล้วรวมค่าเหล่านั้นเฉพาะเมื่อพบครบทุกค่า

object Main {
  val data = Map("a" -> 1, "b" -> 2)
  def main(args: Array[String]): Unit = {
    val combined = for {
      x <- data.get("a")
      y <- data.get("b")
    } yield x + y
    println(combined)
    val missing = for {
      x <- data.get("a")
      z <- data.get("c")
    } yield x + z
    println(missing)
  }
}

ทำไมต้องใช้ for-comprehension

for-comprehension มีข้อดีดังนี้:

  • เรียงลำดับออปชันที่ขึ้นต่อกันได้อย่างอ่านง่าย
  • หยุดทำงานโดยอัตโนมัติเมื่อเป็น None
  • มีความสามารถเทียบเท่า flatMap/map แต่เขียนราบเรียบกว่า
  • กรองด้วย if และผูกค่าระหว่างทางด้วย =

จบลงที่ค่า

for-comprehension จะคืนค่าเป็น Option ดังนั้นให้จบด้วย getOrElse หรือ fold เพื่อให้ได้ค่าธรรมดา

object Main {
  def main(args: Array[String]): Unit = {
    val a: Option[Int] = Some(3)
    val b: Option[Int] = Some(4)
    val total = (for { x <- a; y <- b } yield x + y).getOrElse(0)
    println(total)
  }
}

นำทุกอย่างมาประกอบกัน

ลำดับการทำงานทั้งหมด: แปลงอินพุตสองค่า ตรวจสอบเงื่อนไข รวมค่า แล้วระบุค่าเริ่มต้น

object Main {
  def parse(s: String): Option[Int] = s.toIntOption
  def main(args: Array[String]): Unit = {
    val result = for {
      x <- parse("10")
      y <- parse("5")
      if y != 0
    } yield x / y
    println(result.getOrElse(-1))
  }
}

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

ทดสอบความเข้าใจของคุณเกี่ยวกับ for-comprehension บนออปชัน

สรุปทบทวน

คุณได้เรียนรู้วิธีเชื่อมออปชันด้วย for-comprehension:

  • for { x <- a; y <- b } yield ... ใช้เรียงลำดับออปชันได้อย่างอ่านง่าย
  • รูปแบบนี้จะถูกแปลงกลับเป็น flatMap/map
  • None ใด ๆ จะทำให้ผลลัพธ์ทั้งหมดหยุดลงและเป็น None
  • ตัวสร้างภายหลังใช้ค่าก่อนหน้าได้ ส่วน = ใช้เพิ่มการผูกค่า และ if ใช้กรอง
  • จบด้วย getOrElse หรือ fold เพื่อให้ได้ค่าธรรมดา

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

บทเรียน “Option ใน for-comprehension” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Option ใน for-comprehension” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Option ใน for-comprehension”

เชื่อมต่อออบเจ็กต์ Option คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่

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

บทเรียน “Option ใน for-comprehension” ใช้เวลานานแค่ไหน

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

ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม

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

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

  1. การหลีกเลี่ยง null
  2. map และ flatMap บน Option
  3. getOrElse และ fold
  4. Option ใน for-comprehension
← กลับไปที่ Scala for Backend Engineering & Functional Programming