Auf der Devoxx US 2017-Konferenz, an der ich neulich teilgenommen habe, habe ich die Regeln für den Umgang mit Optional kennengelernt, also werde ich schreiben, was ich dachte, während ich es zusammenfasse.
Mr.Stuart Marks (@stuartmarks) "Optional - Die Mutter aller Bikesheds / Optional - The_Mother_of_all_Bikesheds) "wurde besucht. Dort wurden sieben Regeln eingeführt, wenn [java.util.Optional] verwendet wurde (https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html). ..
Optional.get()
unless you can prove that the Optional is present.Optioal.isPresent()
and Optional.get()
.Bitte beziehen Sie sich auf die folgenden Materialien (mit Ausnahme von Regel 7), was jede bedeutet. Übrigens zeigt vorhanden "den Zustand an, in dem Optional einen Wert hat (≈ nicht leer)", und vorhanden zeigt "den Zustand an, in dem Optional keinen Wert hat (≈ leer)".
Die Devoxx US 2017-Version wurde noch nicht veröffentlicht, aber es scheint, dass er zuvor auf einer anderen Konferenz eine Sitzung mit demselben Titel hatte, und das Material und das Video werden veröffentlicht. Wir empfehlen Ihnen, diesen Artikel zu lesen, da er sehr nützliche Informationen für diejenigen enthält, die über die Verwendung von Optional nachdenken oder kürzlich mit der Verwendung von Optional begonnen haben.
Format | Link |
---|---|
Dokument | https://stuartmarks.files.wordpress.com/2016/09/optionalmotherofallbikesheds3.pdf |
Video | https://www.youtube.com/watch?v=Ej0sss6cq14 |
Twitter Hashtag | https://twitter.com/hashtag/DevoxxOptional?src=hash |
Method | Do absent |
---|---|
orElse(DEFAULT_VALUE) | DEFAULT_Gibt VALUE zurück(Wenn Sie hier eine Methode angeben, wird diese sowohl von Anwesenden als auch von Abwesenden ausgeführt.) |
orElseGet(Object::new) | Supplier.get wird aufgerufen und das dort erstellte Objekt zurückgegeben |
orElseThrow(Exception::new) | Eine Ausnahme auslösen |
Es wurde vor einiger Zeit in TL darüber gesprochen. (Referenz: Verwenden Sie orElseGet (), um den Wert von Optional abzurufen) Wenn Sie den Wert vorbereiten, der zum Zeitpunkt der Abwesenheit durch den Methodenaufruf zurückgegeben werden soll, Sie sollten orElseGet aktiv verwenden. In diesem Fall wird die Methode nur aufgerufen, wenn keine vorhanden ist.
orElse
Immer wenn diese Zeile ausgeführt wird, Sammlungen.emptyList()Wird genannt
.orElse(Collections.emptyList())
orElseGet
Sammlungen nur bei Abwesenheit.emptyList()Wird genannt
.orElseGet(Collections::emptyList)
Optional.get()
Ich persönlich dachte, dass "
Optional.get ()` `` den Wert von Optional leugnet und gelöscht werden sollte. " Aber es stellt sich heraus, dass es nicht wirklich so einfach ist. Schauen Sie sich zuerst den folgenden Code an.
isPresent&get
final Optional<Bounds> caretBoundsOr = editor.getCaretBounds();
if (caretBoundsOr.isPresent()) {
final Bounds bounds = caretBoundsOr.get();
return new Point2D(bounds.getMinX(), bounds.getMinY() + 20);
}
return null;
Es ist ein Prozess, der der Regel "Mit isPresent prüfen und dann abrufen" folgt. Im Falle einer Abwesenheit ist `return null;`
der Fall, in dem Sie in "Warum verwenden Sie Optional, wenn Sie null zurückgeben?"
Wie oben erwähnt, wird der Wert nach Überprüfung mit isPresent () abgerufen, sodass er den Regeln von Mr.Marks folgt. Das optionale isPresent-> get ist jedoch alles andere als besser als nur Code, der eine Nullprüfung durchführt.
Wenn ich darüber nachdenke, ist es sicher, so zu schreiben ...
final Optional<Point2D> pointOr
= editor.getCaretBounds()
.map(bounds -> new Point2D(bounds.getMinX(), bounds.getMinY() + 20));
return pointOr.isPresent() ? pointOr.get() : null;
Optional wird zusammen mit Filter (Verarbeitung nur dann zum nächsten Operator fortsetzen, wenn der Wert der Bedingung entspricht) und Zuordnung (Wert konvertieren) verwendet, wenn nicht nur die Nullprüfung, sondern auch die nachfolgende Verarbeitung zusammen geschrieben wird. Ich denke es ist besser.
Ich dachte, Herr Stuart Marks wollte sagen, dass Sie einfach den ternären Operator verwenden können, wenn Sie Code mit Optional wie dem folgenden schreiben.
Das optional.oder Elle Code
Optional.ofNullable(runScript()).orElse("0").toString()
Die Verwendung des ternären Operators ist kürzer, einfacher zu verstehen und macht unnötige optionale Objekte überflüssig.
Code des ternären Operators, der dasselbe tun kann
final String script = runScript();
script != null ? script : "0"
Recommended Posts