Scala: доступ к необязательному значению в необязательном объекте

Есть ли хороший способ получить доступ к значению параметра внутри объекта параметра? Вложенные совпадения приводят к уродливой древовидной структуре.

Так что если у меня есть например:

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
}

И это довольно уродливо, так как эта конструкция предназначена только для доступа к одному маленькому значению Option.

То, что я хотел бы сделать, это что-то вроде:

optionObject.value.getOrElse(0)

или как вы можете сделать с Swift:

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

Есть ли в Scala что-то, что позволяет мне хорошо справляться с этими вещами?

Спасибо!

1 ответ

Решение

flatMap позволит вам отобразить опцию и "сгладить" результат. Так что если (и только если) внешнее и внутреннее Option оба Some, вы получите Some с вашей ценностью в этом. Вы можете позвонить getOrElse на нем, как вы бы сделали с любым другим Option,

optionObject.flatMap(_.value).getOrElse(0)
Другие вопросы по тегам