根据官方kotlin文档,null对象的toString()调用返回" null" toString()
我想,toString()应该返回一个空字符串("")。我用扩展功能实现了它。
fun Any?.toEmptyStringIfNull() :String {
if (this == null) {
return ""
} else {
return toString()
}
我想知道这是否可以实现更简单/更容易/更清洁,并且无需每次都调用扩展功能。
答案 0 :(得分:21)
怎么样:
nullable?.toString() ?: ""
或Alexander Udalov建议:
nullable?.toString().orEmpty()
哪一个可以包含在扩展方法中:
fun Any?.toStringOrEmpty() = this?.toString() ?: ""
答案 1 :(得分:4)
您可以直接使用nullable.orEmpty()
。
参考: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/or-empty.html
答案 2 :(得分:0)
我提出了一个扩展功能stringify
,我从JavaScript的JSON.stringify()
借来了扩展名。
fun <T> T?.stringify(toString: (T) -> String = { it.toString() }): String =
if (this == null) "" else toString(this)
这涵盖了简单的情况以及您需要进一步处理字符串的情况:
fun simplyConcatenate(s: String, postfix: String?): String =
s + postfix.stringify()
fun getFullTitle(title: String, disambiguation: String?): String =
title + disambiguation.stringify { " ($it)" }
fun demo() {
println(simplyConcatenate("a", null)) // "a"
println(simplyConcatenate("a", "b")) // "ab"
println(getFullTitle("a", null)) // "a"
println(getFullTitle("a", "b")) // "a (b)"
}
答案 3 :(得分:0)
上述答案不适用于不是原始字符串的变量? 因为 toString() 会直接转换一个 Any?到字符串(不是字符串?) 如果您编写类似 xxx.toString() ?: "" 或 xxx.toString().orEmpty() 的内容,IDE 会告诉您永远无法到达正确的路径。
解决方案是使用“让”或“运行”。取决于您是否需要访问外部作用域类的乐趣。
Any? let { it.toString() } ?: ""
Any? run { toString() } ?: ""
例如,我们想要一个来自可空路径的文件名字符串,甚至是非空路径,它的 getFileName() 可能返回空值。在这种情况下我们想要一个空字符串而不是一个“空”字符串。
fun fileName(path: Path?): String = path?.fileName?.run { toString() } ?: ""
fun removeExtension(path: Path?): String = path?.fileName?.let { removeExtension(it.toString()) } ?: ""
fun removeExtension(fileName: String): String = FilenameUtils.removeExtension(fileName)