我有一个变量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"
这可能以某种方式?
答案 0 :(得分:10)
这个怎么样?
obj.map(_.var1).getOrElse("default1")
或者,如果你喜欢这种风格:
obj map (_ var1) getOrElse "default"
答案 1 :(得分:2)
另一种变体是使用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)
答案 2 :(得分:0)
要从Option中提取多个值,我建议返回一个元组并使用提取器语法:
val (val1, val2) = obj.map{o => (o.var1, o.var2)}.getOrElse(("default1", "default2"))