2009-09-01 22 views
20

Nachdem ich die Antworten von Fragen wie this one gesehen habe, die Horrorshows wie den Versuch, die NPE zu fangen und den entstellten Namen aus dem Stack-Trace auszugraben, stelle ich diese Frage, damit ich sie beantworten kann.Wie schreibe ich einen richtigen null-sicheren Koaleszenzoperator in scala?

Kommentare oder weitere Verbesserungen erwünscht.

+3

Sie sollten diese Frage beantwortet haben, anstatt eine neue zu erstellen. Oder vielleicht zusätzlich zu. –

+3

Wenn Sie das sagen. Wenn ich eine Frage mehr als 24 Stunden nach der Antwort beantworte, schmilzt die Antwort in Unklarheit, unabhängig von ihrem relativen Verdienst (und da ich nur auf Scala-Fragen antworte, habe ich eine Vorstellung vom Wert meiner Antwort.) – extempore

+0

Danke, es war ein Horror, um eine Lösung zu sehen, die Ausnahmen beinhaltet. es sei denn, Sie möchten Ihre Anwendung um mehrere Größenordnungen verlangsamen. – smartnut007

Antwort

33

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

Und in Aktion:

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 
+0

das ist wirklich ziemlich cool – jpswain

+8

Ich habe sieben Jahre darauf gewartet, dass jemand diese Beobachtung macht! Vielen Dank. – extempore

Verwandte Themen