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

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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