2016-12-15 4 views
5

私はKotlinには新しく、次のコードをより洗練された方法で書き直すことをお勧めします。Kotlinで空でない、空でない文字列を慣用的にテストする方法は?

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

私は、次のコードを使用している場合:

if (s?.isNotEmpty()) { 

は、コンパイラはその

Required: Boolean 
Found: Boolean? 

感謝を文句を言うでしょう。

+1

あなたはより良いあなたの質問を反映するために、あなたのタイトルを編集してくださいもらえますか? 'Kotlinの方法でこのコードを書く方法 'という多くの疑問を持っていても、実際に後で調べるのは簡単ではありません。 – marstran

+0

@marstranはい。タイトルについて何か提案がありますか?私は自分の問題を説明する良い方法を見つけることができません。ありがとう。 – iForests

+0

「Kotlinの空ではない文字列を慣用的にテストする方法」のようなものでしょうか?基本的には実際の質問を説明するもの。 – marstran

答えて

11

あなたはとても似isNullOrEmptyやその友人isNullOrBlankを使用することができます。

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

isNullOrEmptyisNullOrBlank両方は、このようにあなたがnullで安全に使用することができますCharSequence?上の拡張メソッドです。またそのように偽にnullを回す:

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

よろしくお願いいたします。私はちょうど愚かな質問をしたと思う。 – iForests

+2

スマートキャストを使用して非ヌルとして実際に 's'を使用したい場合は、' if(s!= null && s.isNotEmpty()){_} '_is_ idiomatic Kotlinをこのシナリオに追加します。 – mfulton26

+3

質問はまったく馬鹿ではありません。 –

2

私は非常に多くの@miensolによって答えが好きなものの、私の答えは次のようになります(と私はコメントに入れていない理由です):if (s != null && s.isNotEmpty()) { … }実際ですKotlinの慣用的な方法。この方法でブロック内のStringにスマートキャストを取得しますが、受け入れられた答えの途中でブロック内にs!!を使用する必要があります。

+1

@Kirill Rakhmanの提案もスマートなキャストを生成します: 'if(s?isNotEmpty()== true){}' – Love

+0

それは本当です。ここでの個人的な好みの問題です。疑わしい '== true'の部分を見るとすぐに削除できると思っています。この場合は削除できません。あなたは4文字を保存しますが、私にとっては読みにくいです。 –

0

または拡張メソッドを作成し、安全なコールとしてそれを使用します。

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") 
} 
関連する問題