首页 文章

如何在Kotlin中对非空,非空字符串进行惯用测试?

提问于
浏览
13

我是Kotlin的新手,我正在寻找建议,以更优雅的方式重写以下代码 .

var s: String? = "abc"
if (s != null && s.isNotEmpty()) {
    // Do something
}

如果我使用以下代码:

if (s?.isNotEmpty()) {

编译器会抱怨

Required: Boolean
Found: Boolean?

谢谢 .

3 回答

  • 0

    您可以像这样使用isNullOrEmpty或其朋友isNullOrBlank

    if(!s.isNullOrEmpty()){
        // s is not empty
    }
    

    isNullOrEmptyisNullOrBlank 都是 CharSequence? 上的扩展方法,因此您可以使用 null 安全地使用它们 . 或者将 null 变为false,如下所示:

    if(s?.isNotEmpty() ?: false){
        // s is not empty
    }
    

    你也可以做以下事情

    if(s?.isNotEmpty() == true){ 
        // s is not empty
    }
    
  • 18

    虽然我非常喜欢@miensol的答案,但我的回答是(这就是为什么我不把它放在评论中): if (s != null && s.isNotEmpty()) { … } 实际上是Kotlin的惯用方式 . 只有通过这种方式,您才能在块内获得智能转换,而在接受的答案中,您必须在块内使用 s!! .

  • 3

    或创建一个扩展方法并将其用作安全呼叫:

    fun String?.emptyToNull(): String? {
        return if (this == null || this.isEmpty()) null else this
    }
    
    fun main(args: Array<String>) {
        val str1:String?=""
        val str2:String?=null
        val str3:String?="not empty & not null"
    
        println(str1.emptyToNull()?:"empty string")
        println(str2.emptyToNull()?:"null string")
        println(str3.emptyToNull()?:"will not print")
    }
    

相关问题