java.util.Optional class und null und nicht null

Informationen zur optionalen Klasse

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.

JavaDoc-Speicherort

https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html

So machen Sie optional

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.

Rufen Sie den Wert aus der optionalen Klasse ab

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.

Stream-ähnliche Nutzung

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.

Überprüfung der Datenexistenz

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.

Beispielquelle für diese Zeit gemacht

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

java.util.Optional class und null und nicht null
Klasse und Modell
abstrakt (abstrakte Klasse) und Schnittstelle (Schnittstelle)
Klasse und Sofortteil2
Spring-Boot-Hauptklasse nicht gefunden
Definition und Instanziierung von Java-Klassen
HttpServletRequest-Klassendatei nicht gefunden
Unterschied zwischen Klasse und Instanz
Beziehung zwischen Paket und Klasse
Unterschied zwischen Instanzmethode und Klassenmethode
null und optionale Typen und Ideale und Realität
Unterschied zwischen Schnittstelle und abstrakter Klasse
Holen Sie sich TypeElement und TypeMirror von Class
Es ist nicht "sonst wenn", sondern "sonst" und "wenn"
Unterschied zwischen Instanzvariable und Klassenvariable
StringBuffer- und StringBuilder-Klasse in Java
Interne Studiennotizen im Klassen- und Lambda-Stil
Mockito Argument null Der Annahme-Test hat den Typ angegeben und nicht zurückgegeben