4

我有一个变量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"

这有可能

4

3 回答 3

10

这个怎么样?

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

或者,如果您更喜欢这种风格:

obj map (_ var1) getOrElse "default"
于 2011-08-18T13:34:03.147 回答
2

另一种变体是使用空对象模式的一个版本并直接使用该对象

//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)
于 2011-08-18T19:52:17.593 回答
0

要从选项中提取多个值,我建议返回一个元组并使用提取器语法:

val (val1, val2) = obj.map{o => (o.var1, o.var2)}.getOrElse(("default1", "default2"))
于 2011-08-18T19:23:30.070 回答