Alex Rivera | Logout

How to write a proper null-safe coalescing operator in scala?

Asked 2009-09-01T20:01:21.817
25

Having seen the answers coming out of questions like this one involving horror shows like trying to catch the NPE and dredge the mangled name out of the stack trace, I am asking this question so I can answer it.

Comments or further improvements welcome.

Edit
Report

1 Answer

39

Like so:

case class ?:[T](x: T) {
  def apply(): T = x
  def apply[U >: Null](f: T => U): ?:[U] =
    if (x == null) ?:[U](null)
    else ?:[U](f(x))
}

And in action:

scala> val x = ?:("hel")(_ + "lo ")(_ * 2)(_ + "world")()
x: java.lang.String = hello hello world

scala> val x = ?:("hel")(_ + "lo ")(_ => (null: String))(_ + "world")()
x: java.lang.String = null
answered 2009-09-01T20:01:56.463

Your Answer