Option และ Nullable: ควรใช้แต่ละแบบเมื่อใด
เปรียบเทียบชนิด Option ของ Arrow กับชนิด nullable ของ Kotlin แล้วเลือกใช้ให้เหมาะสม
Option และ Nullable: ควรใช้แต่ละแบบเมื่อใด เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
สองวิธีในการแทนค่าที่ไม่มีอยู่
ชนิดค่าที่อาจเป็นค่าว่างของ Kotlin
T? ของ Kotlin เป็นตัวเลือกตามแนวทางมาตรฐานสำหรับการแทนค่าที่ไม่มีอยู่ในโค้ด Kotlin ส่วนใหญ่ คอมไพเลอร์จะบังคับให้ตรวจสอบค่าว่าง ตัวดำเนินการเรียกแบบปลอดภัย ?. ช่วยเชื่อมการเรียกได้อย่างราบรื่น และ ?: "default" ช่วยกำหนดค่า fallback ได้อย่างกระชับ:
val name: String? = findUser(id)?.name
val display = name ?: "Anonymous"Option<A> ของ Arrow
Option ห่อแนวคิดเรื่องค่าที่อาจเป็นค่าว่างไว้ในชนิดพีชคณิตที่เหมาะสม พร้อม map, flatMap, filter, fold และอื่น ๆ โดยทำงานร่วมกับรูปแบบไปป์ไลน์เชิงฟังก์ชันของ Arrow ได้อย่างเป็นธรรมชาติ:
import arrow.core.Option
import arrow.core.Some
import arrow.core.None
import arrow.core.toOption
val opt: Option<String> = "hello".toOption() // Some("hello")
val absent: Option<String> = Noneการแปลงระหว่าง Option กับค่าที่อาจเป็นค่าว่าง
สามารถแปลงไปมาได้อย่างอิสระ: value?.toOption() ห่อค่าที่อาจเป็นค่าว่างเป็น Option; option.getOrNull() ดึงค่าหรือค่าว่าง; option.getOrElse { default } กำหนดค่า fallback:
val opt: Option<String> = nullableString.toOption()
val back: String? = opt.getOrNull()map และ flatMap บน Option
map { } แปลงค่า Some (และคืนค่า None โดยไม่เปลี่ยนแปลง) ส่วน flatMap { } ใช้เชื่อมการดำเนินการที่คืนค่าเป็น Option เช่นกัน:
val length: Option<Int> = "hello".toOption().map { it.length } // Some(5)
val noneLength: Option<Int> = (null as String?).toOption().map { it.length } // Nonefilter บน Option
filter { predicate } จะแปลง Some เป็น None หาก predicate เป็นเท็จ:
val positiveAge: Option<Int> = 25.toOption().filter { it > 0 } // Some(25)
val rejectedAge: Option<Int> = (-1).toOption().filter { it > 0 } // Nonefold: การใช้ Option
fold(ifEmpty, ifSome) จัดการทั้งสองกรณีในนิพจน์เดียวโดยไม่ต้องจับคู่รูปแบบ:
val result: String = someOption.fold(
ifEmpty = { "Nothing here" },
ifSome = { value -> "Got: $value" }
)ควรเลือก Nullable T? เมื่อใด
ควรเลือกชนิดค่าที่อาจเป็นค่าว่างของ Kotlin (T?) เมื่อ:
- คุณกำลังเขียนโค้ด Kotlin ตามแนวทางมาตรฐานที่ผู้อื่นจะอ่าน
- คุณต้องการเชื่อมตัวดำเนินการที่ปลอดภัยต่อค่าว่าง (
?.,?:) - ชนิดข้อมูลนี้ถูกใช้ใน API ที่ไม่ได้ใช้ Arrow
- ประสิทธิภาพเป็นเรื่องสำคัญ (ไม่มีค่าใช้จ่ายจากการบรรจุอ็อบเจ็กต์)
ควรเลือก Option<A> เมื่อใด
ควรเลือก Option เมื่อ:
- คุณใช้ไปป์ไลน์เชิงฟังก์ชันของ Arrow อยู่แล้ว (
map,flatMap) - คุณต้องการประกอบค่าที่อาจมีหรือไม่มีเข้ากับ
EitherหรือRaise - คุณต้องการทำให้การไม่มีค่าปรากฏอย่างชัดเจนในบริบทเชิงฟังก์ชันทั่วไป
- คุณกำลังสร้างไลบรารีที่ผู้เรียกอาจไม่ได้ใช้ Kotlin
Option ภายใน either { }
ภายในบล็อก either { } ของ Arrow คุณสามารถเรียก .bind() กับ Option ได้ โดยแปลงเป็น Either ก่อน:
fun findUserOpt(id: Long): Option<User> = TODO()
fun getUser(id: Long): Either<UserError, User> = either {
findUserOpt(id)
.toEither { UserError.NotFound }
.bind()
}รูปแบบการใช้ออปชันอย่างไม่เหมาะสม
อย่าใช้ Option ไปเสียทุกที่เพียงเพราะมีชนิดนี้อยู่ ใน Kotlin โดยทั่วไป String? ชัดเจนกว่า Option ในโค้ดแอปพลิเคชันส่วนใหญ่ ควรสงวน Option ไว้ใช้เมื่อ ตัวดำเนินการเชิงฟังก์ชันของมันเพิ่มคุณค่าอย่างแท้จริง
แบบทดสอบสั้น ๆ
None.map { it.length } ส่งคืนค่าอะไรในชนิดออปชันของ Arrow
สรุป: ออปชันและค่าที่เป็นค่าว่าง
ประเด็นสำคัญ:
- Kotlin
T?: เป็นแนวทางมาตรฐานสำหรับโค้ดส่วนใหญ่ คอมไพเลอร์บังคับใช้ และใช้?.กับ?: - Arrow
Option: ชนิดพีชคณิตที่มีตัวดำเนินการเชิงฟังก์ชัน (map,flatMap,fold,filter) - แปลงค่าด้วย
.toOption()และ.getOrNull() - ควรเลือกใช้
T?สำหรับ Kotlin ตามแนวทางมาตรฐาน และเลือกใช้Optionเมื่อประกอบกระบวนการประมวลผลเชิงฟังก์ชันด้วย Arrow
คำถามที่พบบ่อย
บทเรียน “Option และ Nullable: ควรใช้แต่ละแบบเมื่อใด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Option และ Nullable: ควรใช้แต่ละแบบเมื่อใด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Option และ Nullable: ควรใช้แต่ละแบบเมื่อใด”
เปรียบเทียบชนิด Option ของ Arrow กับชนิด nullable ของ Kotlin แล้วเลือกใช้ให้เหมาะสม คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “Option และ Nullable: ควรใช้แต่ละแบบเมื่อใด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Either : การจัดการข้อผิดพลาดตามชนิดโดยไม่ใช้ Exception
- Arrow Raise DSL: การประกอบข้อผิดพลาดแบบมีชนิด
- Option และ Nullable: ควรใช้แต่ละแบบเมื่อใด
- การสร้างแบบจำลองโดเมนเชิงฟังก์ชันด้วยชนิดหลักของ Arrow