Reading multiple variables from an object wrapped in Option []

I have an obj: Option[MyObject] variable and you want to extract several variables from it - if the object is not set, use the default values.

I am currently doing it like this:

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

which is extremely verbose. I know I can do it like this:

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

which still seems weird. I know that I can use one big match and return a value object or tuple.

But what I would like was like this:

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

Is it possible somehow?

+4
source share
3 answers

How about this?

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

or if you prefer this style:

 obj map (_ var1) getOrElse "default" 
+10
source

Another option would be to use a version of the Null Object Pattern and use the object directly

 //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
source

To extract multiple values ​​from a parameter, I would recommend returning the tuple and using extractor syntax:

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

All Articles