Question

Is there any particular reason why Regex.MatchData.group(i: Int): java.lang.String returns null rather than Option[String]?

Is there a "Scala Way" to handle nulls in Scala?

Was it helpful?

Solution

It returns null because it is a shallow interface over the Java library. I think it sucks too, and I have been bitten by it.

If you get a value that may be null, you can write Option(value) on Scala 2.8 and it will become either None or Some(value). That doesn't work with pattern matching, but you can write your own extractor for that:

object Optional {
  def unapply[T](a: T) = if (null == a) Some(None) else Some(Some(a))
}

Examples:

scala> val a:String = null
a: String = null

scala> a match {
     | case Optional(None) => println("Got none")
     | case Optional(Some(value)) => println("Got "+value)
     | }
Got none

scala> val a = "string"
a: java.lang.String = string

scala> a match {
     | case Optional(None) => println("Got none")
     | case Optional(Some(value)) => println("Got "+value)
     | }
Got string

scala> val a = "5"
a: java.lang.String = 5

scala> a match {
     | case Optional(None) => println("Got none")
     | case Optional(Some(value)) => println("Got "+value.toInt)
     | }
Got 5
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top