我刚接触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
转换为 false:
if(s?.isNotEmpty() ?: false){
// s is not empty
}
你也可以做以下操作
if(s?.isNotEmpty() == true){
// s is not empty
}
s
,并将其视为非空类型,则 if (s != null && s.isNotEmpty()) { ... }
是在 Kotlin 中用于这种情况的惯用语。需要说明的是,这种写法符合语言习惯且易于理解。 - mfulton26if (s?.isNotEmpty() == true) {}
。 - Kirill Rakhmanvar
,我也能得到一个很好的智能转换。只要它是一个局部变量,在此期间它就不可能已经改变了。 Kotlin 在这方面有更聪明的表现吗? - Michael Piefelif (s?.isNotEmpty() == true) {}
- Love== true
部分时,我立即认为它可以被删除,但在这种情况下不行。你可以节省 4 个字符,但对我来说可读性会降低。 - Michael Piefel!s.isNullOrEmpty()
将执行智能转换。 - Michael Piefelfun 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)
}
}
我认为这种方法在上下文中与 UI 工具包 Jetpack Compose
更易于阅读。
handles.twitter.ifNotEmpty {
SocialMediaItem(handle = it, type = SocialMedia.TWITTER)
}
另一个扩展选项。 我正在寻找一种验证一堆字符串并使用它们的方法,而嵌套块在这方面阅读起来很麻烦。
fun String?.notNullOrEmpty(illegalArgumentExceptionMsg: String): String {
return if (this == null || this.isEmpty()) throw IllegalArgumentException(illegalArgumentExceptionMsg) else this
}
简单使用
val myNullOrEmptyString: String? = "bar"
val myNotNullString = myNullOrEmptyString.notNullOrEmpty("myNullOrEmptyString should not be empty")
val myNullOrEmptyString: String? = "bar"
val myNotNullString: String = myNullOrEmptyString.notNullOrEmpty("myNullOrEmptyString should not be empty")
测试或使用
@Test
fun emptyNotNullExtension() {
val msg = "foo"
assertThatThrownBy {
val emptyNotNullString: String = "".notNullOrEmpty(msg)
}
.isExactlyInstanceOf(IllegalArgumentException::class.java)
.hasMessageContaining(msg)
assertThatThrownBy {
val emptyNotNullString: String = null.notNullOrEmpty(msg)
}
.isExactlyInstanceOf(IllegalArgumentException::class.java)
.hasMessageContaining(msg)
val myNullOrEmptyString: String? = "bar"
val myNotNullString: String = myNullOrEmptyString.notNullOrEmpty("myNullOrEmptyString should not be empty")
}