我是 Kotlin 的新手,我正在寻求帮助来重写以下代码以使其更优雅。
var s: String? = "abc"
if (s != null && s.isNotEmpty()) {
// Do something
}
如果我使用以下代码:
if (s?.isNotEmpty()) {
编译器会抱怨
Required: Boolean
Found: Boolean?
谢谢。
我是 Kotlin 的新手,我正在寻求帮助来重写以下代码以使其更优雅。
var s: String? = "abc"
if (s != null && s.isNotEmpty()) {
// Do something
}
如果我使用以下代码:
if (s?.isNotEmpty()) {
编译器会抱怨
Required: Boolean
Found: Boolean?
谢谢。
您可以像这样使用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
}
虽然我非常喜欢@miensol 的回答,但我的回答是(这就是为什么我不把它放在评论中):if (s != null && s.isNotEmpty()) { … }
实际上是Kotlin 中的惯用方式。只有这样,您才能String
在块内获得智能转换,而在接受的答案中,您必须s!!
在块内使用。
或创建一个扩展方法并将其用作安全调用:
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")
}
或者您可以创建一个扩展函数:
public inline fun String?.ifNotEmpty(crossinline block: (String) -> Unit): Unit {
if (this != null && this.isNotEmpty()) {
block(this)
}
}
我发现这种方法在Jetpack Compose
UI Toolkit 的上下文中更具可读性。
handles.twitter.ifNotEmpty {
SocialMediaItem(handle = it, type = SocialMedia.TWITTER)
}
在这种情况下,目的是仅在 Twitter 句柄不为空且不是空字符串时才显示该 UI 块。