Angenommen, ich habe eine Methode, session.get(str: String): String
aber Sie wissen nicht, ob sie Ihnen eine Zeichenfolge oder eine Null zurückgibt, da sie aus Java stammt.
Gibt es eine einfachere Möglichkeit, dies in Scala zu behandeln, anstatt session.get("foo") == null
? Vielleicht gilt etwas Magie wie ToOption(session.get("foo"))
und dann kann ich es in Scala wie behandeln
ToOption(session.get("foo")) match {
case Some(_) =>;
case None =>;
}
java
scala
scala-option
José Leal
quelle
quelle
Antworten:
Die Methode des
Option
Begleitobjektsapply
dient als Konvertierungsfunktion für nullfähige Referenzen:quelle
Das
Option
Objekt verfügt über eineapply
Methode, die genau das tut:quelle
Beachten Sie, dass die Arbeit mit Java-Objekten nicht wie erwartet funktioniert:
quelle
Dies ist ein sehr altes Thema, aber ein schönes!
Es ist wahr, dass das Konvertieren eines Nicht-Ausnahme-Ergebnisses von Try to Option zu einem ...
... weil es bei Try nicht um die Überprüfung der Nullfähigkeit geht, sondern nur um eine Möglichkeit, Ausnahmen funktional zu behandeln.
Wenn Sie versuchen, eine Ausnahme abzufangen, und diese zur Vereinfachung in eine Option konvertieren, wird Keine angezeigt, falls eine Ausnahme auftritt.
Sie möchten die Werte von Try beibehalten. Das kann null sein.
Aber es ist auch wahr, dass die Standardbibliothek manchmal ziemlich verwirrend ist ...
Dieses Verhalten ist etwas inkonsistent, spiegelt jedoch die beabsichtigte Verwendung von Try und Option wider.
Sie verwenden try, um alles aus einem Ausdruck herauszuholen, der Ausnahmen auslösen kann, und die Ausnahme selbst ist Ihnen egal.
Der Wert, der herauskommen kann, kann sehr gut eine Null sein. Wenn toOption None gab, konnte man nicht zwischen einer Ausnahme und einer Null unterscheiden , und das ist nicht schön!
Standalone verwenden Sie Option, um die Existenz oder Nicht-Existenz von etwas zu kapseln. In diesem Fall ist Some (null) None, und das ist sinnvoll, da null in diesem Fall das Fehlen von etwas darstellt. Hier gibt es keine Mehrdeutigkeit.
Es ist wichtig zu beachten, dass die referenzielle Transparenz auf keinen Fall beeinträchtigt wird, da .toOption nicht mit Option () identisch ist.
Wenn Sie wirklich BEIDE Ausnahmesicherheit UND Nullsicherheit erzwingen müssen und Ihr Code wirklich nicht wirklich zwischen Null und einer Ausnahme unterscheiden muss , müssen Sie nur beide Paradigmen kombinieren! Denn genau das willst du, oder?
Sie können es auf eine Weise tun ...
... oder ein anderes ...
... oder der lächerlich hässlichste von ihnen ...
quelle