//where f is a function returning Option[Something] val t = f(args) getOrElse 3
Recently I realized (classic lightbulb moment :) that getOrElse actually takes a function as the argument:
def getOrElse [B >: A] (default: ⇒ B): B //Returns the option's value if the option is nonempty, otherwise return the result of evaluating default.
Why does this matter? It means that the code passed to getOrElse doesn't run at all (default is not evaluated) if the Option is defined! For example, this code:
object GetOrElseTest { def main(args : Array[String]) : Unit = { def a() = Some(3) def b() = None val aV = a getOrElse { println("nothing from a :("); 1 } val bV = b getOrElse { println("nothing from b :("); 1 } println("aV=%d, bV=%d".format(aV, bV)) 0 } }
Will print this output (note that the println for getting a, which is defined, never runs):
nothing from b :( aV=3, bV=1
That's awesome and really hard to accomplish in Java. Imagine if log4j could do this; suddenly we wouldn't have any issues with things log.debug("a" + objectThatIsExpensiveToToString.toString()) having a runtime cost even when debug isn't enabled because we wouldn't evaluate the function to create a message at all if debug is off.
The new uniforms are pretty snappy eh first officer!