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

การหลีกเลี่ยง null

พื้นฐาน Option

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

ปัญหาของ null

ในหลายภาษา ค่าที่หายไปจะแทนด้วย null แต่ null ทำให้เกิด NullPointerException ที่น่ากลัวเมื่อคุณลืมตรวจสอบ

Scala มีทางเลือกที่ปลอดภัยกว่า นั่นคือชนิด Option

Option คืออะไร

Option[A] แทนค่าที่อาจมีหรือไม่มีก็ได้ โดยมีกรณีที่เป็นไปได้สองกรณีเท่านั้น:

  • Some(value) เมื่อมีค่าอยู่
  • None เมื่อไม่มีค่า

ตัวชนิดเองจะบอกคุณว่าค่าอาจหายไป

object Main {
  def main(args: Array[String]): Unit = {
    val present: Option[Int] = Some(42)
    val absent: Option[Int] = None
    println(present)
    println(absent)
  }
}

สร้าง Some

ห่อค่าที่มีอยู่ด้วย Some เพื่อบอกว่าค่านั้นมีอยู่แน่นอน

object Main {
  def main(args: Array[String]): Unit = {
    val name: Option[String] = Some("Ada")
    println(name)
  }
}

แทนการไม่มีค่าด้วย None

None คือค่าเดียวที่ใช้เมื่อไม่มีสิ่งใดอยู่ ใช้ได้กับชนิด Option ทุกชนิด

object Main {
  def lookup(found: Boolean): Option[Int] =
    if (found) Some(100) else None
  def main(args: Array[String]): Unit = {
    println(lookup(true))
    println(lookup(false))
  }
}

ฟังก์ชันที่อาจล้มเหลว

การคืนค่า Option ทำให้ความเป็นไปได้ที่จะไม่มีผลลัพธ์ปรากฏอย่างชัดเจนในลายเซ็นชนิดข้อมูล ผู้เรียกจึงละเลยกรณีนี้ไม่ได้

object Main {
  def findUser(id: Int): Option[String] =
    if (id == 1) Some("Grace") else None
  def main(args: Array[String]): Unit = {
    println(findUser(1))
    println(findUser(2))
  }
}

ตรวจสอบด้วย isDefined และ isEmpty

isDefined บอกว่า Option เป็น Some หรือไม่ ส่วน isEmpty บอกว่าเป็น None หรือไม่

object Main {
  def main(args: Array[String]): Unit = {
    val a: Option[Int] = Some(5)
    val b: Option[Int] = None
    println(a.isDefined)
    println(b.isEmpty)
  }
}

จับคู่รูปแบบกับ Option

เนื่องจาก Option เป็น ADT แบบ sealed คุณจึงจับคู่รูปแบบกับมันได้ วิธีนี้จัดการทั้งกรณีที่มีค่าและไม่มีค่าได้อย่างชัดเจน

object Main {
  def greet(name: Option[String]): String = name match {
    case Some(n) => s"Hello, $n"
    case None    => "Hello, stranger"
  }
  def main(args: Array[String]): Unit = {
    println(greet(Some("Bo")))
    println(greet(None))
  }
}

สร้าง Option จากค่าที่อาจเป็น null

หากจำเป็นต้องทำงานกับโค้ดที่คืนค่า null ให้ห่อค่าด้วย Option(...) วิธีนี้จะแปลง null เป็น None และแปลงค่าจริงใด ๆ เป็น Some

object Main {
  def main(args: Array[String]): Unit = {
    val maybe = Option("data")
    val nothing = Option(null)
    println(maybe)
    println(nothing)
  }
}

ไลบรารีมาตรฐานคืนค่า Option

เมธอดในตัวจำนวนมากคืนค่า Option แทนการเสี่ยงเกิดข้อผิดพลาด ตัวอย่างเช่น List.headOption จัดการรายการว่างได้อย่างปลอดภัย

object Main {
  def main(args: Array[String]): Unit = {
    val xs = List(1, 2, 3)
    val empty = List.empty[Int]
    println(xs.headOption)
    println(empty.headOption)
  }
}

ทำไมจึงควรใช้ Option แทน null

Option ดีกว่า null เพราะ:

  • ทำให้ค่าที่หายไปมองเห็นได้จากชนิดข้อมูล
  • บังคับให้ผู้เรียกจัดการกรณีที่ไม่มีค่า
  • กำจัด NullPointerExceptions
  • นำไปประกอบกับ map, flatMap และนิพจน์ for ได้

นำทุกอย่างมารวมกัน

การค้นหาขนาดเล็กที่คืนค่า Option จากนั้นจัดการอย่างปลอดภัยด้วยการจับคู่รูปแบบ

object Main {
  val prices = Map("apple" -> 3, "pear" -> 5)
  def priceOf(item: String): Option[Int] = prices.get(item)
  def main(args: Array[String]): Unit = {
    priceOf("apple") match {
      case Some(p) => println(s"costs $p")
      case None    => println("not for sale")
    }
    println(priceOf("banana"))
  }
}

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

ทดสอบความเข้าใจของคุณเกี่ยวกับ Option

สรุปทบทวน

คุณได้เรียนรู้การหลีกเลี่ยง null ด้วย Option:

  • Option[A] คือ Some(value) หรือ None
  • ทำให้การไม่มีค่าที่อาจเกิดขึ้นปรากฏอย่างชัดเจนในชนิดข้อมูล
  • ตรวจสอบด้วย isDefined/isEmpty หรือการจับคู่รูปแบบ
  • ใช้ Option(x) เพื่อห่อค่าที่อาจเป็น null
  • เมธอดในไลบรารี เช่น headOption และ Map.get จะคืนค่า Option

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

บทเรียน “การหลีกเลี่ยง null” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การหลีกเลี่ยง null”

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

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

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

บทเรียน “การหลีกเลี่ยง null” ใช้เวลานานแค่ไหน

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