Android Kotlin 智能运算符重载

Android Kotlin smart operator overloading

如果重载一些 Kotlin 运算符并像这样使用它会怎样:

// Inits somewhere before usage.
val someStrFromServer: String? 
lateinit var myFieldText: TextView

override fun onStart() {
    super.onStart()
    myFieldText.text = someStrFromServer / R.string.app_none
}

运算符重载:

operator fun String?.div(resId: Int): String {
    return if (this.isNullOrBlank()) {
        context.getString(resId)
    } else {
        this
    }
} 

如果someStrFromServer为空则输出:

D/DEBUG: None

如果someStrFromServer不为空则输出:

D/DEBUG: someStrFromServer

有谁知道 Kotlin 中是否存在更有效、更快捷的方法来处理这个问题?也许,甚至更多,global,比如 extension function.

你可以这样做,但它不是很直观,因为 div 通常只用于数学计算。我建议使用类似

的东西
someStrFromServer.takeUnless { it.isNullOrBlank()} ?: context.getString(resId)

或通过扩展进行简化

fun String?.fallback(resId: Int) = takeUnless { it.isNullOrBlank()} ?: context.getString(resId)

这样使用:

myFieldText.text = someStrFromServer.fallback(R.string.app_none)