什么是kotlin的最佳方法,对于null对象的toString()方法返回空字符串而不是" null"

时间:2016-04-22 13:15:16

标签: string kotlin null nullable

根据官方kotlin文档,null对象的toString()调用返回" null" toString()

我想,toString()应该返回一个空字符串("")。我用扩展功能实现了它。

fun Any?.toEmptyStringIfNull() :String {
if (this == null) {
    return ""
} else {
    return toString()
}

我想知道这是否可以实现更简单/更容易/更清洁,并且无需每次都调用扩展功能。

4 个答案:

答案 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)