2017-05-23 7 views
8

自分自身を文字列に変換する方法を知っているnull可能なプロパティ(Javaオブジェクト)があります。この表現が空でない場合は、それで何かをしなさい。私はKotlinにこれを変換する最も慣用的な方法を見つけようとしている、と私は持っているnull以外のオブジェクトと空でない文字列表現を扱うためのKotlinイディオム

MyObject obj = ... 
if (obj != null) { 
    String representation = obj.toString(); 
    if (!StringUtils.isBlank(representation)) { 
     doSomethingWith(representation); 
    } 
} 

with(obj?.toString()) { 
     if (!isNullOrBlank()) { 
      doSomethingWith(representation) 
     } 
    } 

しかし、それはまだ、そのようなのためにあまりにも多くの仕事のように感じているJavaではこれは次のようになります簡単な操作です。私はletwhenwithを組み合わせると、これを少し小さくすることができます。

手順は次のとおりです。

  1. 物(A)は
  2. nullでない場合は、オブジェクトの文字列表現(B)(A)は
  3. がで何かを行い空白でない場合は(B)

私が試した:

when(where?.toString()) { 
     isNullOrBlank() -> builder.append(this) 
    } 

しかし、(1)それはで失敗します。

Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: @InlineOnly public inline fun 
CharSequence?.isNullOrBlank(): Boolean defined in kotlin.text @InlineOnly public inline fun CharSequence?.isNullOrBlank(): Boolean defined in 
kotlin.text 

そして、それはそれを過ぎました場合でも、(2)それは私が実際に含めるように気にしない、徹底的elseをしたいと思います。

「コットンウェイ」とは何ですか?あなたはどちらか、(Kotlin 1.1以降)内蔵のSTDLIB takeIf()またはtakeUnless拡張機能を使用働くことができ

答えて

9

obj?.toString().takeUnless { it.isNullOrBlank() }?.let { doSomethingWith(it) } 

// or 

obj?.toString()?.takeIf { it.isNotBlank() }?.let { doSomethingWith(it) } 

// or use a function reference 

obj?.toString().takeUnless { it.isNullOrBlank() }?.let(::doSomethingWith) 

を最終値にアクションdoSomethingWith()を実行するためには、apply()にを使用することができます現在のオブジェクトのコンテキスト内で動作し、戻り値は同じオブジェクトです。式の結果を変更する場合はlet()、現在のオブジェクトのコンテキストではrun()を処理し、式の結果を変更する場合はalso()をex元のオブジェクトを返す間、エコーコードを返します。

また、あなたは、ネーミングは、たとえばnullIfBlank()のために、より意味のあるものにしたい場合は良い名前かもしれない独自の拡張機能を作成することができます。

NULL可能 Stringの拡張として定義されて
obj?.toString().nullIfBlank()?.also { doSomethingWith(it) } 

fun String?.nullIfBlank(): String? = if (isNullOrBlank()) null else this 

我々は1つの以上の拡張を追加した場合:

fun <R> String.whenNotNullOrBlank(block: (String)->R): R? = this.nullIfBlank()?.let(block) 
をあなたは常にあなたのコードの可読性を向上させるために、このような拡張を書くことができ

obj?.toString()?.whenNotNullOrBlank { doSomethingWith(it) } 

// or with a function reference 

obj?.toString()?.whenNotNullOrBlank(::doSomethingWith) 

:210

これはコードがに簡素化することができます。

注:時々、私は?.ヌルセーフアクセサを使用していましたが、他の時は使用しないことがありました。これは、一部の関数のプリディケート/ラムダがnull値を使用して動作するため、他の関数は使用できないためです。これらはいずれかの方法で設計できます。それはあなた次第です! Idiomatic way to deal with nullables

+2

良い答えを、私はあなたがここにある場合、テストを中心に切り替えると思う:

このトピックの詳細については、を参照してください。文字列表現が_not_ nullであれば、彼は 'doSomethingWith'を呼び出すことを望みます。 – marstran

+0

ああ、私の答えをフリップされます:-)ありがとう –

+0

@marstran正しい - 私は良い_文字列表現を持っている場合_ thing_をしたいです。 –

関連する問題