Подтвердить что ты не робот

Как написать правильный нуль-безопасный оператор коалесценции в scala?

Увидев ответы, исходящие из таких вопросов, как этот, включающий ужас, показывает, как пытаться поймать NPE и вычерпать искаженное имя из трассировка стека, я задаю этот вопрос, чтобы ответить на него.

Комментарии или дальнейшие улучшения приветствуются.

4b9b3361

Ответ 1

Так же:

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))
}

И в действии:

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