Option lets us express null value explicitly without the null "hack".
Option is an abstract class and its two concrete subclasses are Some, for when we have a value, and None, when we don't.
You can see Option, Some, and None in action in the following example, where we create a map of state capitals in the United States:
object Main {
def main(args: Array[String]) {
val stateCapitals = Map(
"Alabama" -> "Montgomery",
"Alaska" -> "Juneau",
"Wyoming" -> "Cheyenne")
println( "Get the capitals wrapped in Options:" )
println( "Alabama: " + stateCapitals.get("Alabama") )
println( "Wyoming: " + stateCapitals.get("Wyoming") )
println( "Unknown: " + stateCapitals.get("Unknown") )
println( "Get the capitals themselves out of the Options:" )
println( "Alabama: " + stateCapitals.get("Alabama").get )
println( "Wyoming: " + stateCapitals.get("Wyoming").getOrElse("Oops!") )
println( "Unknown: " + stateCapitals.get("Unknown").getOrElse("Oops2!") )
}
}
The Map.get method returns an Option[T], where T is String in this case.
By returning an Option, we can't "forget" that we have to verify that something was returned.
If the Option is a Some, Some.get returns the value.
If the Option is actually None, then None.get throws a NoSuchElementException.
getOrElse in the last two println statements
returns either the value in the Option, if it is a Some instance, or it returns
the argument passed to getOrElse, if it is a None instance.
getOrElse argument behaves as the default return value.