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

时间:2016-12-15 11:15:25

标签: kotlin kotlin-null-safety

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

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

如果我使用以下代码:

if (s?.isNotEmpty()) {

编译器会抱怨

Required: Boolean
Found: Boolean?

感谢。

3 个答案:

答案 0 :(得分:24)

您可以像这样使用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
}

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

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")
}