給代碼加個保險箱!Kotlin getOrElse花式用法大揭秘
先來個小劇場
? 程序員小張:"我的App又閃退了!用戶輸入了個不存在的索引..."
? 隔壁老王:"用getOrElse
啊!比try-catch
優雅100倍!"
? 小張:"還有這種摸魚神器?"
這個函數有點東西
getOrElse
就像你的代碼保鏢——當你要從集合里拿東西時:? 能拿到 → 直接給你想要的? 拿不到 → 掏出你事先準備的Plan B
舉個栗子
val snackCabinet = listOf("辣條", "薯片", "可樂")
fun main() {
// 正常情況
println(snackCabinet.getOrElse(1) { "空氣" }) // 輸出:薯片
// 作死情況
println(snackCabinet.getOrElse(10) {
"第10個柜子是老板藏的私房錢,別碰!"
}) // 輸出:第10個柜子是老板藏的私房錢,別碰!
}
三大必殺技
1?? 數組/列表的防崩神器
val temperatureData = arrayOf(23, 25, 22)
fun getTemperature(index: Int): Any {
// 常規寫法 vs getOrElse
// if (index < temperatureData.size) temperatureData[index] else "N/A"
return temperatureData.getOrElse(index) { "Sensor Error" }
}
fun main() {
println(getTemperature(5)) // 輸出:Sensor Error
}
2?? Map的萬能鑰匙
val employeeBonuses = mutableMapOf("老王" to 5000)
fun calculateBonus(name: String): Int {
// 當你要找不存在的鍵時...
return employeeBonuses.getOrElse(name) {
// 動態計算默認值
(employeeBonuses.values.average() * 0.5).toInt()
}
}
fun main() {
println(calculateBonus("Reathin")) // 輸出:2500 (因為只有老王一個人)
}
3?? 超智能的默認值工廠
默認值可以是個函數
!這意味著你可以:
val stockPrices = listOf(18.5, 19.3, 20.1)
fun fetchStock(index: Int): Double {
return stockPrices.getOrElse(index) {
// 實時獲取最新股價
Random.nextDouble(15.0, 25.0)
}
}
fun main() {
println("%.2f".format(fetchStock(10))) // 輸出類似:21.34
}
靈魂拷問區
? ?問:和?:空合并操作符有啥區別?
? ??答:getOrElse能根據索引/鍵動態生成默認值,更靈活!
? ?問:會影響性能嗎?
? ??答:lambda表達式會被inline處理,放心用!
實戰套路
場景1:表單校驗
data class UserForm(val name: String, val age: Int)
fun parseForm(inputs: List<Any>): UserForm {
return UserForm(
name = inputs.getOrElse(0) { "Reathin" }.toString(),
age = (inputs.getOrElse(1) { 18 } as? Int) ?: 18
)
}
fun main() {
println(parseForm(listOf("Reathin"))) // 輸出:UserForm(name=Reathin, age=18)
}
場景2:游戲開發
val inventory = arrayOf("藥水", "寶劍")
fun useItem(slot: Int) {
val item = inventory.getOrElse(slot) {
throw IllegalArgumentException("空氣怎么用?")
}
println("使用 $item")
}
fun main() {
useItem(3) // 拋出異常:IllegalArgumentException
}
專家級騷操作
套娃寫法
// 如果連默認值都可能不存在?再套一層!
fun getDeepValue() = listOf(1, 2, 3).getOrElse(5) {
(10..20).filter { it % 3 == 0 }
.getOrElse(4) { -1 }
}
fun main() {
println(getDeepValue()) // 輸出:-1
}
結合其他函數
// 先過濾再獲取,雙保險!
fun processData() = (1..10)
.filter { it % 2 == 0 }
.map { it * 10 }
.getOrElse(5) { listOf(-1) }
fun main() {
println(processData()) // 輸出:[20, 40, 60, 80, 100, -1]
}
避坑指南
?? 注意:當Map的值為null時,依然會觸發默認值!
val nullableMap = mapOf("key" to null)
println(nullableMap .getOrElse("key") { "我是備胎" }) // 輸出:我是備胎
總結大禮包
getOrElse
的正確打開方式:
? 把可能爆炸的操作換成安全模式
? 默認值可以玩出花樣(計算值、拋異常、調用函數...)
? 讓代碼像德芙一樣絲滑~
下次遇到索引越界/鍵不存在時,記得給你的代碼上個保險!快去試試這些騷操作吧~