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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การหลีกเลี่ยง null
- map และ flatMap บน Option
- getOrElse และ fold
- Option ใน for-comprehension