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