Kleiner Option-Trick


Nach meinem Urlaub hier erst mal ein kleines Lebenszeichen. Vielen Dank für euere Geduld!

Zum Wiedereinstieg möchte ich erst mal ein kleineres Häppchen servieren. Ich habe sicher schon irgendwo das unglaublich nützliche Option Cheat-Sheet von Toni Morris‘ Lambda Blog erwähnt, oder? Eine recht häufige Situation, die dort leider nicht vorkommt, ist folgende:

option match {
  case None => foo
  case Some(x) => bar(x)
}

Auf dem „eingepackten“ x (so es denn existiert) soll also eine Funktion ausgeführt, für None dagegen ein Default-Wert verwendet werden. Ein einfaches, aber halbwegs realistisches Beispiel dafür ist eine Längenfunktion für String-Options:

def len(strOpt:Option[String]):Int = strOpt match {
   case None => -1
   case Some(str) => str.length
}

Das ist zwar sehr übersichtlich, aber in manchen Fällen würde man sich doch wünschen, das alles in eine Zeile zu packen. Und das geht so:

def len(strOpt:Option[String]):Int = strOpt.map(_.length).getOrElse(-1)

Das allgemeine „Rezept“ ist demnach:

option.map(x => bar(x)).getOrElse(foo)

Wenn man es einmal gesehen hat, ist es ganz einleuchtend. Aber die Schwierigkeit besteht weniger darin, auf diese Lösung zu kommen, sondern darin, sich die Zeit zu nehmen, die case-Variante überhaupt erst einmal genauer unter die Lupe zu nehmen und nach Verbessererungen zu suchen. Und so schließe ich mit einem meiner Lieblingszitate:

Keine Verbesserung ist zu klein oder geringfügig, als dass man sie nicht durchführen sollte.

(Theodor W. Adorno)

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s