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