web-dev-qa-db-ja.com

Scalaの単一のステートメントでnullをチェックする方法は?

私のscalaコード:

QueueManager.add(getObject)

ここで、getObjectQueueObject型のオブジェクトを返すメソッドです。

def getObject : QueuObject = {
    val response = //some response
    return response
}

QueueObjectを追加しながら、nullの応答を確認する方法はありますか?私はこれができることを知っています:

if (getObject != null)
    QueueManager.add(getObject)

しかし、私はインデントのレベルを追加したくありません。そのインラインを行う演算子はありますか?

ありがとう。

43
theTuxRacer

Scalaでnullを使用しないようにしてください。それは本当にJavaとの相互運用性のためだけにあります。 Scalaでは、空になる可能性のあるものにOptionを使用します。 nullを返す可能性のあるJava APIメソッドを呼び出している場合は、すぐにOptionでラップします。

def getObject : Option[QueueObject] = {
  // Wrap the Java result in an Option (this will become a Some or a None)
  Option(someJavaObject.getResponse)
}

注:Scalaでvalに入れたり、明示的なreturnステートメントを使用する必要はありません。結果はブロック内の最後の式の値になります(実際、ステートメントは1つしかないため、ブロックさえ必要ありません)。

def getObject : Option[QueueObject] = Option(someJavaObject.getResponse)

他の人がすでに示したものに加えて(例えば、foreachOptionを呼び出すと、少し混乱するかもしれません)、mapを呼び出して(そして結果を無視することもできます)マップ操作が必要ない場合)

getObject map QueueManager.add

OptionNoneである場合、これは何もせず、QueueManager.addSomeの場合。

通常のifを使用すると、インデントレベルを回避するためだけに、これらの「トリック」を使用するよりも明確かつ簡単になります。また、1行で記述することもできます。

if (getObject.isDefined) QueueManager.add(getObject.get)

または、nullを使用する代わりにOptionを処理する場合:

if (getObject != null) QueueManager.add(getObject)

編集-ベンは正しい。副作用がある場合は、getObjectを複数回呼び出さないように注意してください。次のように書いてください:

val result = getObject
if (result.isDefined) QueueManager.add(result.get)

または:

val result = getObject
if (result != null) QueueManager.add(result)
71
Jesper
Option(getObject) foreach (QueueManager add)
12

代わりに_Option[QueueObject]_を返した場合は、_getObject.foreach { QueueManager.add }_のような構造を使用できます。 Option(getObject).foreach ...Noneであるため、Option[QueueObject](null)でインラインにラップできます。

12
Ben Jackson

@Ben Jackson's asnwer with Option(getObject).foreachがそれを行う好ましい方法であると確信していますが、私はAnyRef pimpを使用して、次のように書くことができます。

getObject ifNotNull ( QueueManager.add(_) )

読みやすいと思います。

そして、より一般的な方法で、私は時々書く

val returnVal = getObject ifNotNull { obj =>
  returnSomethingFrom(obj)
} otherwise {
  returnSomethingElse
}

... Optionを扱っている場合、ifNotNullをifSomeに置き換えます。最初にオプションをラップしてからパターンマッチングするよりも明確です。

(実装については、 ifTrue、ifFalse、ifSome、ifNoneなどの実装Scala if(...)および単純なパターンマッチングを回避するために およびOtherwise0/Otherwise1 クラス。)