3

これが初心者の質問である場合は申し訳ありません... Scalaでは、インスタンスを返すが何も返さない可能性がある関数がある場合、返すOptionよりもを使用する方が好ましいことを理解しています。null 参照を渡しておらず、どこかnullで危険を冒していないため、これにより安全性が向上することを理解しています。NullPointerException

ただし、パターン マッチングを使用するよりも、オプションを処理するためのクリーンな方法はありますか? 私が最終的に使用する構文は次のとおりです。

val optObj : Option[MyObject] = myFunctionThatReturnsOption
optObj match {
  case Some(obj) => {
  //my code using obj
  }

  case None => _
}

実際には、これを行うことはすべて Java バージョンと同等です。

MyObject obj = myMethodThatCanReturnNull()
if (obj != null) {
  //my code using obj
}

Option参照の代わりに使用する場合、Scala でこのボイラープレートをすべて回避する他の方法はありnullますか? 私がやりたいのは、 に何らかのオブジェクトが含まれている限りOption(つまり、 ではない場合None)、コードを実行することだけです。

4

5 に答える 5

8

より一貫した方法で作業したい場合はforeachgetOrElseand/orを使用してください。mapいくつかのユースケースと私がすることは次のとおりです。

 //I want to get a non-null value and I have a sane default
 val result = myOption getOrElse 3

 //I want to perform some side effecting action but only if not None
 myOption foreach{ value =>
   println(value toString ())
 }
 //equivalently
 for(value <- myOption){
   //notice I haven't used the "yeild" keyword here
 }

 //I want to do a computation and I don't mind if it comes back as an Option
 val result = for(value <- myOption) yield func(value)
 val equivalent = myOption map func

3 番目の例ではmap、両方のケースで使用されます。

func「理解のために」(Google用語)で物事を組み合わせて一致させることができると、非常に興味深いものになります。これも返されるとしましょうOptionが、特定の場合にのみ機能させたいとします。

 val result = for{ 
   value <- myOption if value > 0
   output <- func(value)
 } yield output

これで、ゼロより大きい整数が含まれているOption場合にのみ返されます。myOptionかなり気の利いたものですね。

于 2014-04-23T14:43:11.397 に答える
3

foreach値を使用して副作用のある操作を実行したいだけの場合に使用できます。

optObj.foreach(obj => {
    //my code using obj
})

他のユースケースがある場合は、 、またはOptionなどで他の方法を使用する必要があります。mapfiltergetOrElse

于 2014-04-23T14:43:11.577 に答える
1

flatMap- メソッドは でかなりうまく使用できますOption。彼のように:

case class Player(name: String)
def lookupPlayer(id: Int): Option[Player] = {
  if (id == 1) Some(new Player("Sean"))
  else if(id == 2) Some(new Player("Greg"))
  else None
}
def lookupScore(player: Player): Option[Int] = {
  if (player.name == "Sean") Some(1000000) else None
}

println(lookupPlayer(1).map(lookupScore))  // Some(Some(1000000))
println(lookupPlayer(2).map(lookupScore))  // Some(None)
println(lookupPlayer(3).map(lookupScore))  // None

println(lookupPlayer(1).flatMap(lookupScore))  // Some(1000000)
println(lookupPlayer(2).flatMap(lookupScore))  // None
println(lookupPlayer(3).flatMap(lookupScore))  // None
于 2014-04-23T14:46:34.030 に答える
1

オプションに関する Scala のベスト プラクティスのリファレンスは次のとおりです

于 2014-04-23T15:01:29.363 に答える