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

map และ flatMap บน Option

ประกอบการทำงานอย่างปลอดภัย

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

แปลงค่าใน Option

บ่อยครั้งคุณมี Option และต้องการแปลงค่าหาก มี ค่าอยู่ โดยปล่อยให้ None คงเดิม

เมธอด map ทำสิ่งนี้ได้พอดี โดยไม่ต้องแยกค่าออกด้วยตนเอง

ใช้ map

map นำฟังก์ชันไปใช้กับค่าภายใน Some และคืนค่า Some ใหม่ หากเป็น None จะไม่ทำอะไรและคืนค่า None

object Main {
  def main(args: Array[String]): Unit = {
    val n: Option[Int] = Some(10)
    val doubled = n.map(x => x * 2)
    println(doubled)
  }
}

map กับ None

เมื่อ Option เป็น None แล้ว map จะข้ามฟังก์ชันทั้งหมดและยังคงเป็น None

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

object Main {
  def main(args: Array[String]): Unit = {
    val empty: Option[Int] = None
    val result = empty.map(x => x * 2)
    println(result)
  }
}

เปลี่ยนชนิดข้อมูล

map สามารถแปลงเป็นชนิดอื่นได้เช่นเดียวกับที่ทำกับคอลเลกชัน ในที่นี้ Option[Int] กลายเป็น Option[String]

object Main {
  def main(args: Array[String]): Unit = {
    val n: Option[Int] = Some(7)
    val label = n.map(x => s"value=$x")
    println(label)
  }
}

ปัญหาการซ้อนชั้น

จะเกิดอะไรขึ้นหากฟังก์ชันของคุณคืนค่า Option เอง การใช้ map จะทำให้ได้ Option[Option[A]] ที่ซ้อนกัน ซึ่งใช้งานไม่สะดวก

ตรงนี้เองที่ flatMap เข้ามาช่วย

object Main {
  def half(x: Int): Option[Int] = if (x % 2 == 0) Some(x / 2) else None
  def main(args: Array[String]): Unit = {
    val n: Option[Int] = Some(8)
    val nested = n.map(half)
    println(nested)
  }
}

ใช้ flatMap

flatMap นำฟังก์ชันที่คืนค่า Option ไปใช้ แล้ว คลี่ผลลัพธ์ ให้เป็น Option เดียว

ลองเปรียบเทียบผลลัพธ์นี้กับรูปแบบที่ซ้อนกันจากฉากก่อนหน้า

object Main {
  def half(x: Int): Option[Int] = if (x % 2 == 0) Some(x / 2) else None
  def main(args: Array[String]): Unit = {
    val n: Option[Int] = Some(8)
    val flat = n.flatMap(half)
    println(flat)
  }
}

ต่อ flatMap เป็นสาย

เนื่องจากแต่ละขั้นคืนค่า Option คุณจึงเรียก flatMap ต่อกันได้หลายครั้ง หากขั้นตอนใดให้ผลเป็น None ทั้งสายจะกลายเป็น None

object Main {
  def half(x: Int): Option[Int] = if (x % 2 == 0) Some(x / 2) else None
  def main(args: Array[String]): Unit = {
    val result = Some(16).flatMap(half).flatMap(half)
    println(result)
  }
}

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

หากขั้นตอนตรงกลางคืนค่า None ขั้นตอนถัดไปจะถูกข้าม และผลลัพธ์สุดท้ายจะเป็น None

การหยุดโดยอัตโนมัตินี้ช่วยตัดการตรวจสอบ null ด้วยตนเอง

object Main {
  def half(x: Int): Option[Int] = if (x % 2 == 0) Some(x / 2) else None
  def main(args: Array[String]): Unit = {
    val result = Some(8).flatMap(half).flatMap(half)
    println(result)
  }
}

รวม map กับ flatMap

ใช้ flatMap สำหรับขั้นตอนที่คืนค่าเป็น Option และใช้ map สำหรับการแปลงค่าธรรมดาในขั้นตอนสุดท้าย

object Main {
  def parse(s: String): Option[Int] = s.toIntOption
  def main(args: Array[String]): Unit = {
    val result = Some("21").flatMap(parse).map(_ * 2)
    println(result)
  }
}

ทำไมต้องใช้ map และ flatMap

เมธอดเหล่านี้ช่วยให้คุณทำสิ่งต่อไปนี้ได้:

  • แปลงค่าโดยไม่ต้องแกะค่าภายในออกมา
  • ข้ามการทำงานโดยอัตโนมัติเมื่อเป็น None
  • เชื่อมการดำเนินการที่อาจล้มเหลวเข้าด้วยกัน
  • หลีกเลี่ยง Option[Option[A]] ที่ซ้อนกันด้วย flatten

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

ตัวอย่างลำดับการทำงานที่สมจริง: ค้นหาคีย์ แปลงค่า แล้วจึงแปลงรูปแบบ โดยทำงานอย่างปลอดภัยตลอดลำดับ

object Main {
  val config = Map("port" -> "8080")
  def main(args: Array[String]): Unit = {
    val port = config.get("port").flatMap(_.toIntOption).map(_ + 1)
    println(port)
    val missing = config.get("host").flatMap(_.toIntOption)
    println(missing)
  }
}

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

ทดสอบความเข้าใจของคุณเกี่ยวกับ map และ flatMap

สรุปทบทวน

คุณได้เรียนรู้วิธีประกอบออปชันเข้าด้วยกัน:

  • map แปลงค่าภายใน Some โดยปล่อยให้ None คงเดิม
  • flatMap ใช้ฟังก์ชันที่คืนค่าเป็นออปชันและทำให้ผลลัพธ์ที่ซ้อนกันแบนลง
  • การเชื่อมต่อจะหยุดการทำงานต่อและได้ None หากขั้นตอนใดเป็น None
  • ใช้ flatMap กับขั้นตอนที่คืนค่าเป็นออปชัน และใช้ map กับขั้นตอนธรรมดา

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

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

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

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

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

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

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

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

บทเรียน 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