Чтение нескольких переменных из объекта, заключенного в Option [] - PullRequest
4 голосов
/ 18 августа 2011

У меня есть переменная obj: Option[MyObject] и я хочу извлечь из нее несколько переменных - если объект не задан, следует использовать значения по умолчанию.

В настоящее время я делаю это так:

val var1 = obj match {
    case Some(o) => e.var1
    case _ => "default1"
}
val var2 = obj match {
    case Some(o) => e.var2
    case _ => "default2"
}
...

, что очень многословно. Я знаю, что мог бы сделать это так:

val var1 = if (obj.isDefined) obj.get.var1 else "default1"
val var2 = if (obj.isDefined) obj.get.var2 else "default2"

, что все еще кажется странным. Я знаю, что мог бы использовать одно большое совпадение и вернуть объект значения или кортеж.

Но то, что я хотел бы, выглядит примерно так:

val var1 = obj ? _.var1 : "default1"
val var2 = obj ? _.var2 : "default2"

Возможно ли это как-то ?

Ответы [ 3 ]

10 голосов
/ 18 августа 2011

Как насчет этого?

obj.map(_.var1).getOrElse("default1")

или, если вы предпочитаете этот стиль:

obj map (_ var1) getOrElse "default"
2 голосов
/ 18 августа 2011

Другим вариантом будет использование версии Null Object Pattern и непосредственное использование объекта

//could also be val or lazy val
def myDefault = new MyObject {
  override val var1 = "default1"
  override val var2 = "default2"
}

val myObj = obj getOrElse myDefault

use(myObj.var1)
use(myObj.var2)
0 голосов
/ 18 августа 2011

Чтобы извлечь несколько значений из Option, я бы рекомендовал вернуть кортеж и использовать синтаксис экстрактора:

val (val1, val2) = obj.map{o => (o.var1, o.var2)}.getOrElse(("default1", "default2"))
...