33

我是 Kotlin 的新手,我正在寻求帮助来重写以下代码以使其更优雅。

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

如果我使用以下代码:

if (s?.isNotEmpty()) {

编译器会抱怨

Required: Boolean
Found: Boolean?

谢谢。

4

4 回答 4

46

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

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

isNullOrEmpty和都是isNullOrBlank扩展方法,CharSequence?因此您可以安全地使用它们null。或者null像这样变成假:

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

您还可以执行以下操作

if(s?.isNotEmpty() == true){ 
    // s is not empty
}
于 2016-12-15T11:16:55.850 回答
5

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

于 2017-03-29T07:27:05.697 回答
1

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

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")
}
于 2018-03-07T18:09:10.340 回答
0

或者您可以创建一个扩展函数

public inline fun String?.ifNotEmpty(crossinline block: (String) -> Unit): Unit {
    if (this != null && this.isNotEmpty()) {
        block(this)
    }
}

看到它在行动

我发现这种方法在Jetpack ComposeUI Toolkit 的上下文中更具可读性。

handles.twitter.ifNotEmpty {
    SocialMediaItem(handle = it, type = SocialMedia.TWITTER)
}

在这种情况下,目的是仅在 Twitter 句柄不为空且不是空字符串时才显示该 UI 块。

于 2021-08-18T11:47:11.860 回答