【问题标题】:Whats the best way in kotlin for an null object's toString() method to return an empty string instead of "null"在 kotlin 中,空对象的 toString() 方法返回空字符串而不是“null”的最佳方法是什么
【发布时间】:2016-04-22 13:15:15
【问题描述】:

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

我希望 toString() 应该返回一个空字符串 ("")。我用扩展函数实现了它。

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

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

【问题讨论】:

    标签: string kotlin null nullable


    【解决方案1】:

    怎么样:

    nullable?.toString() ?: ""
    

    或如Alexander Udalov 建议的那样:

    nullable?.toString().orEmpty()
    

    哪一个可以包装在扩展方法中:

    fun Any?.toStringOrEmpty() = this?.toString() ?: ""
    

    【讨论】:

    • 或者更易读的版本:nullable?.toString().orEmpty()
    • 如果你不关心性能下降,实现可能是"${this ?: ""}"
    【解决方案2】:

    您可以直接使用nullable.orEmpty()

    参考: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/or-empty.html

    编辑: 提供的答案不完整 - 仅适用于 String? 而不适用于 Any?,如下面评论中指出的那样。

    【讨论】:

    • 这是更好的答案。
    • orEmpty 接受String 对象,问题是关于将Any? 转换为String
    • @javaxian,感谢您的指出。你确实是对的。将更新我的答案。
    【解决方案3】:

    上述答案不适用于不是原始字符串的变量? 因为 toString() 会直接转换一个 Any?到字符串(不是字符串?) 如果您编写类似 xxx.toString() ?: "" 或 xxx.toString().orEmpty() 的内容,IDE 会告诉您永远无法到达正确的路径。

    解决方案是使用“let”或“run”。取决于你是否需要访问外部作用域类的乐趣。

        Any? let { it.toString() } ?: ""
        Any? run { toString() } ?: ""
    

    例如一个有趣的我们想要一个来自可空路径的文件名字符串,甚至是一个非空路径,它的 getFileName() 可能返回空值。在这种情况下,我们需要一个空字符串而不是“null”字符串。

        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)
    
    

    【讨论】:

      【解决方案4】:

      我提出了一个扩展函数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)"
      }
      

      编辑:现在在kotlin-lib 中可用。

      【讨论】:

        【解决方案5】:
        nullable?.let {it.toString()}
        

        如果“可空”为空,则不会更进一步。作为变体。唯一的问题是会有一个警告“可以删除冗余的 'let' 调用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-23
          • 2013-01-19
          • 1970-01-01
          相关资源
          最近更新 更多