getOrElse และ fold
ดึงค่าออกมา
getOrElse และ fold เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
การนำค่าออกมา
ท้ายที่สุด คุณจะต้องดึงค่าธรรมดาออกจาก Option โดยจัดเตรียมค่าที่เหมาะสมไว้เมื่อเป็น None
Scala มีตัวช่วยดึงค่าอย่างปลอดภัย เช่น getOrElse และ fold สำหรับกรณีนี้
การใช้ getOrElse
getOrElse คืนค่าภายใน Some หรือคืนค่าเริ่มต้นที่คุณระบุเมื่อเป็น None
เมธอดนี้คืนค่าเป็นค่าธรรมดาเสมอ ไม่เคยคืนค่าเป็นออปชัน
object Main {
def main(args: Array[String]): Unit = {
val a: Option[Int] = Some(5)
val b: Option[Int] = None
println(a.getOrElse(0))
println(b.getOrElse(0))
}
}ค่าเริ่มต้นทำงานแบบขี้เกียจ
ค่าเริ่มต้นใน getOrElse จะถูกประเมินผลก็ต่อเมื่อออปชันเป็น None ดังนั้นค่าเริ่มต้นที่ใช้ทรัพยากรมากจะไม่ก่อค่าใช้จ่ายใด ๆ เมื่อมีค่าอยู่แล้ว
object Main {
def expensiveDefault(): Int = { println("computing default"); 99 }
def main(args: Array[String]): Unit = {
val present: Option[Int] = Some(7)
println(present.getOrElse(expensiveDefault()))
}
}หลีกเลี่ยง get
ออปชันมีเมธอด get แต่เมธอดนี้จะโยนข้อยกเว้นเมื่อเป็น None ซึ่งขัดกับจุดประสงค์ของการใช้ออปชัน
ควรใช้ getOrElse, fold หรือการจับคู่รูปแบบแทน
orElse สำหรับออปชันสำรอง
orElse ทำงานต่างออกไป โดยจะคืนออปชันแรกหากเป็น Some มิฉะนั้นจะคืนออปชันสำรอง
ใช้เมธอดนี้เมื่อต้องการลองทางเลือกอื่นที่อาจไม่มีค่าเช่นกัน
object Main {
def main(args: Array[String]): Unit = {
val primary: Option[Int] = None
val backup: Option[Int] = Some(42)
println(primary.orElse(backup))
}
}แนะนำ fold
fold จัดการทั้งสองกรณีได้ในการเรียกครั้งเดียว คุณระบุค่าเริ่มต้นสำหรับ None ก่อน แล้วจึงระบุฟังก์ชันสำหรับค่าที่อยู่ใน Some
เมธอดนี้คืนผลลัพธ์เดียว โดยแปลงค่าเมื่อมีค่าอยู่
object Main {
def main(args: Array[String]): Unit = {
val n: Option[Int] = Some(10)
val result = n.fold(0)(x => x * 2)
println(result)
}
}fold เมื่อเป็น None
เมื่อออปชันเป็น None fold จะคืนค่าเริ่มต้นที่คุณระบุไว้ก่อน และไม่สนใจฟังก์ชันแปลงค่า
object Main {
def main(args: Array[String]): Unit = {
val empty: Option[Int] = None
val result = empty.fold(-1)(x => x * 2)
println(result)
}
}fold เป็นชนิดอื่น
ทั้งสองแขนงของ fold ต้องคืนค่าเป็นชนิดเดียวกัน แต่ชนิดนั้นอาจแตกต่างจากชนิดค่าภายในออปชันได้
ในที่นี้ เราแปลง Option[Int] เป็น String
object Main {
def describe(o: Option[Int]): String =
o.fold("missing")(x => s"value $x")
def main(args: Array[String]): Unit = {
println(describe(Some(8)))
println(describe(None))
}
}การเลือกใช้แต่ละแบบ
แนวทางอย่างรวดเร็ว:
getOrElse: ระบุค่าเริ่มต้นที่มีชนิดเดียวกันorElse: ระบุออปชันสำรองfold: แปลงค่าและระบุค่าเริ่มต้นในขั้นตอนเดียว- การจับคู่รูปแบบ: ใช้เมื่อแต่ละกรณีต้องมีตรรกะเพิ่มเติม
การใช้ร่วมกับ map
รูปแบบที่ใช้กันทั่วไปคือใช้ map เพื่อแปลงค่าก่อน แล้วใช้ getOrElse เพื่อให้ได้ค่าธรรมดาในท้ายที่สุด
object Main {
def main(args: Array[String]): Unit = {
val name: Option[String] = Some("ada")
val display = name.map(_.toUpperCase).getOrElse("ANON")
println(display)
}
}นำทุกอย่างมาประกอบกัน
ค้นหาค่าการกำหนดค่า ระบุออปชันสำรอง แล้วจึงใช้ getOrElse เพื่อให้ได้ค่าเริ่มต้น
object Main {
val env = Map("timeout" -> "30")
def main(args: Array[String]): Unit = {
val timeout = env.get("timeout")
.flatMap(_.toIntOption)
.getOrElse(60)
println(timeout)
val retries = env.get("retries").fold(3)(_.toInt)
println(retries)
}
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับการดึงค่าจากออปชัน
สรุปทบทวน
คุณได้เรียนรู้วิธีดึงค่าจากออปชันอย่างปลอดภัย:
getOrElse(default)คืนค่าหรือค่าเริ่มต้น โดยประเมินผลแบบขี้เกียจorElse(fallback)คืนค่า Some ตัวแรกหรือออปชันสำรองfold(default)(f)แปลงค่า Some และใช้ค่าเริ่มต้นกับ None ในขั้นตอนเดียว- หลีกเลี่ยง
getซึ่งจะโยนข้อยกเว้นเมื่อเป็น None
คำถามที่พบบ่อย
บทเรียน “getOrElse และ fold” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “getOrElse และ fold” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “getOrElse และ fold”
ดึงค่าออกมา คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “getOrElse และ fold” ใช้เวลานานแค่ไหน
บทเรียน 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