Als Ergebnis von Artikeln, die ich über die Klasse Option
gelesen habe, die Ihnen hilft, die NullPointerException zu vermeiden, habe ich angefangen, sie überall zu verwenden. Stellen Sie sich so etwas vor:
und später, wenn ich es verwende:
%Vor% So etwas zu tun, fühlt sich für mich nicht "richtig" an. Ich habe auch bemerkt, dass .get
veraltet ist. . Sind das Sachen, die ihr mit Options macht, oder gehe ich in die falsche Richtung?
Es ist im Allgemeinen keine gute Idee, Option
zurückzugeben und dann getOrElse
zu verwenden, um einen Sentinel-Wert zu erzeugen, der "nicht gefunden" bedeutet. Das ist, was Option
dafür bestimmt ist: zu signalisieren, dass ein Wert nicht gefunden wird!
Option
zeigt wirklich seine Stärke, wenn es in Verbindung mit funktionalen Programmierkonstrukten wie map
und foreach
verwendet wird. Dies ist am wirksamsten, wenn es um mehrere Optionen geht. Angenommen, ich schreibe eine Methode, die eine Zeichenfolge annimmt und mir eine Datei zurückgibt, aber nur, wenn die Datei existiert und eine Datei ist, die kein Verzeichnis ist:
Bisher ist die Verwendung von null
einfacher - zumindest bis Sie vergessen haben, dass Sie null
erhalten und eine NPE erhalten. Wie auch immer, lass uns jetzt versuchen, es zu benutzen.
Schau, was passiert ist! Im ersten Fall mussten wir logische Tests von Hand durchführen und temporäre Variablen erstellen. Pfui! Im zweiten Fall hat map
die ganze Drecksarbeit für uns erledigt: None wurde auf None abgebildet und Some(file)
wurde auf Some(fileinputstream)
abgebildet. Einfach!
Aber es wird noch besser. Vielleicht möchten wir die Größe einer ganzen Reihe von Dateien finden:
%Vor% Warte, was ist hier los - was ist mit all dem None
? Müssen wir nicht aufpassen und irgendwie damit umgehen? Nun, hier kommt flatMap
ins Spiel: Es vereint alle Antworten in einer einzigen Liste. None
ist eine Antwort der Länge Null, also ignoriert sie es. Some(f)
hat eine Antwort - f
- so wird es in die Liste eingefügt. Dann verwenden wir eine Falte, um alle Längen zu addieren - jetzt, da alle Elemente in der Liste gültig sind. Ziemlich nett!
Es ist eine gute Idee, den Wert von Option
nicht aufzulösen, sondern anzuwenden Logik auf das, was darin enthalten ist:
Im Grunde wird ein File
verarbeitet, wenn einer gefunden wird und nichts anderes geschieht (und entspricht Thomas 'erstem for
Verständnis, weil for
zu einem Aufruf von foreach
kompiliert wird). Es ist eine prägnante Version von:
Das Tolle daran ist, dass Sie Operationen verketten können, etwa wie folgt:
%Vor%In den meisten Fällen würden Sie den Mustervergleich verwenden
%Vor%Wenn Sie nur an der Datei interessiert sind, wenn sie da ist, können Sie einen for expression
verwenden %Vor%Sie können dann für Ausdrücke ketten, die auf mehreren Ebenen in Containern funktionieren
%Vor%Alternativ können Sie isDefined verwenden und erhalten:
%Vor%get ist in Scala 2.8.0.Beta-1 nicht veraltet.
Hier ist eine Alternative:
%Vor% Wenn Sie jedoch etwas tun müssen, wenn die Datei existiert, und etwas anderes, wenn dies nicht der Fall ist, ist eine match
-Anweisung besser geeignet:
Das ist ziemlich genau das gleiche wie eine if
Anweisung, aber ich mag, dass es die Natur besser verkettet, zB für Option
, wo ich auch einen Wert extrahieren möchte.
Meistens wiederholen Sie, was alle sagen, aber ich denke, es gibt mindestens 4 verschiedene Situationen, denen Sie begegnen werden, wenn Sie eine Nullable-Var wie folgt haben:
1. Die Datei darf nicht null sein
%Vor%Wird eine Ausnahme auslösen, wenn Sie versuchen, die Datei tatsächlich zu verwenden. Fail schnell, yay!
2. Die Datei ist null, aber in diesem Fall haben wir einen vernünftigen Standardwert:
3. Zwei Zweige der Logik, basierend darauf, ob die Datei existiert:
%Vor%
4. No-Op, wenn die Datei null ist, alias stillschweigend. Ich denke nicht, dass mir das im wirklichen Leben sehr oft vorzuziehen ist:
%Vor%Oder vielleicht deutlicher?
%Vor%Tags und Links scala scala-option