Kotlin 中安全地處理可空類型的方式
在 Kotlin 中,可空類型(如 String?)是語言設(shè)計的核心特性之一,旨在從編譯時避免 NullPointerException(NPE)。
1 核心處理方式
1.1 安全調(diào)用操作符(?.)
直接調(diào)用可空對象的方法或?qū)傩?,若對象?null,則返回 null,而非拋出異常:
val str: String? = null val length: Int? = str?.length // str 為 null 時,length 直接為 null
鏈?zhǔn)秸{(diào)用:
// 傳統(tǒng)方式(可能 NPE) val result = obj.property.method() // 安全方式 val result = obj?.propery?.method() // 任意環(huán)節(jié)為 null 時,直接返回 null
1.2 Elvis 操作符(?:)
當(dāng)可空值為 null 時,提供默認(rèn)值或處理邏輯。
val str: String? = null val length: Int = str?.length ?: 0 // str 為 null 時,返回 0 // 安全調(diào)用 + Elvis 結(jié)合使用 val name: String = user?.name ?: "Unknown" // 若 user 或 name 為 null,使用默認(rèn)值
1.3 非空斷言操作符(!!.)
明確告訴編譯器“該值不可能為 null”,若值為 null 則拋出 NPE(需謹(jǐn)慎使用)。
val str: String? = "Hello" val length: Int = str!!.length
適用場景:
初始化階段已確保值不為空,但編譯器無法推斷;
單元測試總驗證代碼邏輯的正確性;
1.4 let 作用域函數(shù)
對非空值執(zhí)行操作,空值則跳過。
val str: String? = "Hello"
str?.let { nonNullStr ->
// 僅在 str 非空時執(zhí)行,nonNullStr 為非空類型 String
println(nonNullStr.uppercase())
}1.5 also 或 apply 函數(shù)
對可空對象進(jìn)行鏈?zhǔn)讲僮鳌?/strong>
val user = nullableUser?.apply {
age += 1 // 若 nullableUser 非空,執(zhí)行 age 自增
}1.6 空檢查(if(x != null))
手動檢查空值,編譯器會只能轉(zhuǎn)換類型。
val str: String? = "Hello"
if (str != null) {
// str 在此作用域內(nèi)自動轉(zhuǎn)換為非空類型 String
println(str.length) // 無需安全調(diào)用
}1.7 延遲初始化(lateinit)
用于標(biāo)記非空但稍后初始化的變量(僅限 var)。
lateinit var user User // 必須確保初始化后再使用
fun initUser() {
user = User("Eileen")
}1.8 類型檢查與智能轉(zhuǎn)換
通過 is 檢查類型后,編譯器自動智能轉(zhuǎn)換。
if (value is String) {
println(value.length) // value 自動轉(zhuǎn)為 String 類型
}1.9 安全類型轉(zhuǎn)換(as?)
轉(zhuǎn)換失敗時返回 null,而非拋出 ClassCastException。
val obj: Any = "Hello" val str: String? = obj as? String // 轉(zhuǎn)換成功,str 為 "Hello" val num: Int? = obj as? Int // 轉(zhuǎn)換失敗, num 為 null
2.0 集合的可空處理
使用 filterNotNull() 或 mapNotNull() 過濾或轉(zhuǎn)換可空集合。
val list: List<String?> = listOf("a", null, "b")
val nonNullList = list.filterNotNull() // [a, b]
val lengths = list.mapNotNull { it?.length } // [1, 1]2.1 可空類型的擴(kuò)展函數(shù)
自定義處理邏輯,例如為 String? 提供空值處理。
fun String?.orEmtpy(): String = this ?: "" val safeText: String = nullableText.orEmpty() // 若為 null,轉(zhuǎn)為空字符串
2 總結(jié)
- 優(yōu)先使用安全調(diào)用(
?.)和 Elvis(?.):簡潔高效,避免 NPE; - 謹(jǐn)慎使用非空斷言(
!!):僅在確定值非空時使用,否則會破壞 Kotlin 的空安全設(shè)計; - 使用
let作用域函數(shù)處理非空邏輯:避免空值分支的冗余代碼;
到此這篇關(guān)于Kotlin 中該如何安全地處理可空類型的文章就介紹到這了,更多相關(guān)Kotlin 可空類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
response.setContentType()參數(shù)以及作用詳解
這篇文章主要介紹了response.setContentType()參數(shù)以及作用詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
IntelliJ IDEA 構(gòu)建maven多模塊工程項目(詳細(xì)多圖)
這篇文章主要介紹了IntelliJ IDEA 構(gòu)建maven多模塊工程項目(詳細(xì)多圖),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
關(guān)于Spring的@Autowired依賴注入常見錯誤的總結(jié)
有時我們會使用@Autowired自動注入,同時也存在注入到集合、數(shù)組等復(fù)雜類型的場景。這都是方便寫 bug 的場景,本篇文章帶你了解Spring @Autowired依賴注入的坑2021-09-09
Spring向頁面?zhèn)髦岛徒邮茼撁鎮(zhèn)鬟^來的參數(shù)詳解
這篇文章主要給大家介紹了關(guān)于Spring向頁面?zhèn)髦岛徒邮茼撁鎮(zhèn)鬟^來的參數(shù)的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-06-06

