私のscalaコード:
QueueManager.add(getObject)
ここで、getObject
はQueueObject
型のオブジェクトを返すメソッドです。
def getObject : QueuObject = {
val response = //some response
return response
}
QueueObjectを追加しながら、nullの応答を確認する方法はありますか?私はこれができることを知っています:
if (getObject != null)
QueueManager.add(getObject)
しかし、私はインデントのレベルを追加したくありません。そのインラインを行う演算子はありますか?
ありがとう。
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)
他の人がすでに示したものに加えて(例えば、foreach
でOption
を呼び出すと、少し混乱するかもしれません)、map
を呼び出して(そして結果を無視することもできます)マップ操作が必要ない場合)
getObject map QueueManager.add
Option
がNone
である場合、これは何もせず、QueueManager.add
がSome
の場合。
通常の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)
Option(getObject) foreach (QueueManager add)
代わりに_Option[QueueObject]
_を返した場合は、_getObject.foreach { QueueManager.add }
_のような構造を使用できます。 Option(getObject).foreach ...
はNone
であるため、Option[QueueObject](null)
でインラインにラップできます。
@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
クラス。)