Wenn Sie in JavaDoc nach einer detaillierten Erklärung suchen, sprechen Sie darüber, wofür Sie dies schreiben. Eine kurze Erläuterung der optionalen Klasse ist daher hilfreich, wenn Sie mit Daten arbeiten, von denen Sie nicht wissen, ob sie null sind oder nicht.
Eigentlich ist es eine Weile her, dass ich die Entwicklungsumgebung auf Java8 verschoben habe, aber tatsächlich hat mir die Art und Weise, wie ich sie geschrieben habe, nicht gefallen. Ich war jedoch überrascht, es zu benutzen und bedauerte, es nicht benutzt zu haben.
Ich möchte über eine solche optionale Klasse schreiben.
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html
Optional.ofNullable("aaa")
Optional.of("aaa")
Anstatt neu zu erstellen, verwenden Sie of`` of Nullable
, um den Wert zu erstellen.
Der Unterschied zwischen den beiden ist der Name, der nullbare verwendet "ofNullable" und der nicht null, den man "of" verwendet.
Da of
mit Objects.requireNonNull
auf Wert überprüft wird, führt die Übergabe von null zu einer NullPointerException
.
Wenn die Erfassungsmethode auch nicht null sein muss, unterscheidet sich die Erfassungsmethode abhängig davon, ob sie nullwertfähig ist.
Zuerst aus dem Nicht-Null-Fall
get()
orElseThrow(Supplier<? extends X> exceptionSupplier)
Wenn "get" null ist, tritt eine "NullPointerException" auf.
orElseThrow
kann die Ausnahme steuern, wenn sie mit einem Argument null ist.
Verwenden Sie einfach die Methode, mit der Sie die Ausnahme steuern möchten.
Als nächstes folgt der nullbare Fall.
orElse(T other)
orElseGet(Supplier<? extends T> other)
orElse
wird verwendet, indem der Wert übergeben wird, wenn der Wert von Optional als Argument null ist (Bild, das den Standardwert übergibt).
Das Argument wird so verwendet, wie es ist, daher ist es in Ordnung, hier null zu setzen.
Wenn der Wert von Optional null ist, werden orElseGet
-Aufrufe des Lieferanten von einem anderen übergeben und der Wert wird zurückgegeben.
Der optionale Wert kann nullwertfähig sein. Beachten Sie jedoch, dass der Lieferant nicht null sein darf.
Die optionale Klasse implementiert "map" "flatmap" zum Konvertieren von Werten und "filter" zum Filtern. Wenn Sie also einen Wert haben, können Sie einfach implementieren, was Sie konvertieren oder filtern möchten. Wenn es keinen Wert gibt, wird er nicht speziell verarbeitet, daher ist es normalerweise praktisch.
Der Unterschied zwischen "Karte" und "Flatmap" ist schwer in Worten auszudrücken, deshalb werde ich ihn weglassen. Grundsätzlich denke ich, dass nur "Karte" etwas tun wird.
isPresent()
ifPresent(Consumer<? super T> consumer)
isPresent
gibt true zurück, wenn die Daten vorhanden sind, false, wenn sie vorhanden sind.
Da es "orElse" gibt, muss es beim Abrufen des Werts nicht überprüft werden, aber ohne es ist dies ein Problem.
ifPresent
ist ein praktisches untergeordnetes Element, das behandelt, was zu tun ist, wenn Daten vorhanden sind, indem es in einem Lambda-Ausdruck übergeben wird.
Da es sich um einen ungültigen Typ handelt, kann er nur einfach verarbeitet werden, es ist jedoch schwierig, ihn herauszunehmen und zu verarbeiten.
Ich werde die Quelle angeben, die ich für die Überprüfung des Vorgangs erstellt habe, um diesen Artikel dieses Mal zu erstellen. Es ist keine große Sache, aber ich hoffe, es hilft.
package javasample;
import java.util.Optional;
public class Main {
public static void main(String[] args) {
Optional<String> str = Optional.ofNullable("aaa");
Optional<String> str2 = Optional.ofNullable("");
Optional<String> str3 = Optional.ofNullable(null);
Optional<String> str4 = Optional.of("aaa");
Optional<String> str5 = Optional.of("");
// Optional<String> str6 = Optional.of(null);
Optional<Text> text = Optional.ofNullable(null);
Optional<Text> text2 = Optional.ofNullable(new Text());
System.out.println(str.get());
System.out.println(str2.get());
System.out.println(str3.orElse(null));
System.out.println("");
System.out.println(str4.get());
System.out.println(str5.get());
// System.out.println(str6.get());
System.out.println("");
System.out.println(text.orElse(null));
System.out.println(text.map(Text::getText).orElse("ccc"));
System.out.println(text.flatMap(text3 -> Optional.of(text3.text)).orElse(null));
System.out.println(text2.get());
System.out.println(text2.map(Text::getText2).get());
System.out.println(text2.flatMap(text3 -> Optional.of(text3.text)).orElse(null));
System.out.println("");
str.ifPresent(text3 -> System.out.println(text3 + text3));
str2.ifPresent(text3 -> System.out.println(text3 + text3));
str3.ifPresent(text3 -> System.out.println(text3 + text3));
}
public static class Text {
private String text = "aaa";
private String text2 = "bbb";
public String getText() {
return text;
}
public String getText2() {
return text2;
}
}
}
Recommended Posts