How can I do the following more efficiently:
myoptionList.filter(_.isDefined).map(_.get)
This will take two iterations time, is there any better way to do this?
You have a couple of options.  The simplest is probably flatten.  Since Option is implicitly convertible to Iterable, you can flatten a list of Options in much the same way you would a list of lists:
myOptionList.flatten
You can also use flatMap in much the same way.  Here are a few options:
myOptionList.flatMap(x => x)
myOptionList.flatMap(identity(_))
myOptionList.flatMap(Option.option2Iterable)
myOptionList.flatMap[Int,List[Int]](identity)
You can also use collect.  collect takes a PartialFunction as an argument.  If a match is found, then the value is mapped according to the function.  Otherwise it is filtered out.  So here, you could match on just Some(x) and map to x (so that all Nones are filtered out).  This option is the most general, and will allow you to apply even more refined logic if you so desire.
myOptionList.collect { case Some(x) => x }
//Example of more complex logic:
myOptionList.collect {
    case Some(x) if x % 2 == 0 => x / 2
}
I'd also like to mention that in general when you have complex logic that takes more than one operation on a list, but you don't want to traverse over the list multiple times, you can use view:
myOptionList.view.filter(_.isDefined).map(_.get) //Will only traverse list once!
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With