7

オプション オブジェクト内のオプション値にアクセスする良い方法はありますか? ネストされた一致ケースは、醜いツリー構造になります。

たとえば、次のようにします。

case class MyObject(value: Option[Int])
val optionObject : Option[MyObject] = Some(MyObject(Some(2))

値にアクセスするために私が知っている唯一の方法は次のとおりです。

val defaultCase = 0 //represents the value when either of the two is None
optionObject match {
    case Some(o) => o.value match {
        case Some(number) => number
        case None => defaultCase
    }
    case None => defaultCase
}

そして、この構成体は 1 つの小さな Option 値にアクセスするためだけのものであるため、これは非常に醜いです。

私がやりたいことは次のようなものです:

optionObject.value.getOrElse(0)

またはSwiftでできるように:

if (val someVal = optionObject.value) {
   //if the value is something you can access it via someVal here
}

これらのことをうまく処理できるScalaの何かがありますか?

ありがとう!

4

1 に答える 1

8

flatMapオプションをマップし、結果を「平坦化」できます。したがって、アウターとインナーOptionが両方Someである場合 (およびその場合にのみ)、値を含む を取得Someします。getOrElseその後、他の と同じように呼び出すことができますOption

optionObject.flatMap(_.value).getOrElse(0)
于 2015-03-07T09:18:01.927 に答える