web-dev-qa-db-ja.com

Kotlinでnullでも空でもない文字列を慣用的にテストする方法は?

私はKotlinを初めて使用するので、次のコードをより洗練されたものに書き直す手助けを探しています。

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

次のコードを使用した場合:

if (s?.isNotEmpty()) {

コンパイラは文句を言うでしょう

Required: Boolean
Found: Boolean?

ありがとう。

24
iForests

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
}
31
miensol

@miensolの回答はとても気に入っていますが、私の回答は次のようになります(そのため、コメントに含めません):if (s != null && s.isNotEmpty()) { … }実際isの慣用的な方法コトリン。この方法でのみ、ブロック内でStringへのスマートキャストを取得できます。一方、承認された回答では、ブロック内でs!!を使用する必要があります。

4
Michael Piefel

または、拡張メソッドを作成して安全な呼び出しとして使用します。

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")
}
1
mt.uulu