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

iFo*_*sts 20 kotlin kotlin-null-safety

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

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

如果我使用以下代码:

if (s?.isNotEmpty()) {
Run Code Online (Sandbox Code Playgroud)

编译器会抱怨

Required: Boolean
Found: Boolean?
Run Code Online (Sandbox Code Playgroud)

谢谢.

mie*_*sol 29

你可以这样使用isNullOrEmpty或者它的朋友isNullOrBlank:

if(!s.isNullOrEmpty()){
    // s is not empty
}
Run Code Online (Sandbox Code Playgroud)

双方isNullOrEmptyisNullOrBlank都在扩展方法CharSequence?从而可以用放心使用null.或者null像这样变成假:

if(s?.isNotEmpty() ?: false){
    // s is not empty
}
Run Code Online (Sandbox Code Playgroud)

你也可以做以下事情

if(s?.isNotEmpty() == true){ 
    // s is not empty
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你想使用智能强制转换实际使用`s`作为非null,我会在这个场景中添加`if(s!= null && s.isNotEmpty()){...}`_is_ idiomatic Kotlin. (4认同)
  • 问题根本不是愚蠢的.另一种可能的形式是`if(s?.isNotEmpty()== true){}` (4认同)

Mic*_*fel 6

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

\n

  • 请注意,我的答案已经过时了。`!s.isNullOrEmpty()` 将执行智能转换。 (7认同)
  • @Kirill Rakhman 的建议也会产生一个智能转换:`if (s?.isNotEmpty() == true) {}` (2认同)