Überprüfen Sie die Notizen für die Klasse java.util.Optional

Überblick

Dies ist eine Überprüfungsnotiz der in Java 1.8 eingeführten Klasse java.util.Optional.

Umgebung

Referenz

Optional<T> - Java 1.8

empty / of / ofNullable

Beides sind statische Methoden. Optional verfügt nicht über einen öffentlichen Konstruktor. Verwenden Sie diese Methoden, um ein optionales Objekt zu erstellen.

empty

Gibt ein optionales Objekt mit einem Nullwert zurück.

Optional<String> empty = Optional.empty();
empty.isPresent();
// false

empty.orElse("other");
// other

empty.get();
// java.util.NoSuchElementException: No value present

of

Gibt ein optionales Objekt mit einem Wert ungleich Null zurück.

String str = "nonNull";
Optional<String> nonNullString = Optional.of(str);
nonNullString.isPresent();
// true

nonNullString.get();
// result : nonNull

Das Übergeben eines Nullobjekts an of löst eine Ausnahme aus.

String str = null;
Optional.of(str);
//  java.lang.NullPointerException

ofNullable

Gibt ein optionales Objekt mit einem Wert zurück, der null (nullbar) sein kann.

String str = null;
Optional<String> nullableString = Optional.ofNullable(str);
nullableString.isPresent();
// false

nullableString.orElse("other");
// other

get / isPresent

get

Gibt den Wert zurück, der vom optionalen Objekt gehalten wird. Wenn der beizubehaltende Wert null ist, wird eine NoSuchElementException ausgelöst.

String str = "apple";
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.get();
// apple
String str = null;
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.get();
// java.util.NoSuchElementException: No value present

isPresent

Gibt true zurück, wenn der vom optionalen Objekt gehaltene Wert nicht null ist, false, wenn er null ist.

String str = "apple";
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.isPresent();
// true
String str = null;
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.isPresent();
// false

orElse / orElseGet / orElseThrow

orElse

Gibt den Wert zurück, der vom optionalen Objekt gehalten wird. Wenn der beizubehaltende Wert null ist, wird der angegebene Wert zurückgegeben. (Null ist auch möglich)

String str = "nonNull";
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.orElse("other");
// nonNull
String str = null;
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.orElse("other");
// other

nullableString.orElse(null);
// null

orElseGet

Gibt den Wert zurück, der vom optionalen Objekt gehalten wird. Wenn der beizubehaltende Wert null ist, wird das Ergebnis des angegebenen Lieferanten zurückgegeben. Wenn der Lieferant null zurückgibt, wird null zurückgegeben.

String str = "nonNull";
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.orElseGet(() -> "other");
// nonNull
String str = null;
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.orElseGet(() -> "other");
// other

nullableString.orElseGet(() -> null);
// null

orElseThrow

Gibt den Wert zurück, der vom optionalen Objekt gehalten wird. Wenn der beizubehaltende Wert null ist, wird die angegebene Ausnahme ausgelöst.

String str = null;
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.orElseThrow(RuntimeException::new);
// java.lang.RuntimeException

ifPresent

Wenn der vom optionalen Objekt gehaltene Wert nicht null ist, wird der im Argument angegebene Consumer-Verarbeitungsblock mit diesem Wert ausgeführt. Wenn der vom optionalen Objekt gehaltene Wert null ist, wird keine Ausnahme ausgelöst und nichts ausgeführt.

Optional<Employee> employee = Optional.ofNullable(new Employee(1L, "john"));
employee.ifPresent((e) -> {
    e.setName(e.getName().toUpperCase());
    System.out.println(e);
    // Employee{id=1, name='JOHN'}
});

filter / map / flatMap

filter

Wenn der vom optionalen Objekt gehaltene Wert nicht null ist, wird der im Argument mit diesem Wert angegebene Prädikatverarbeitungsblock ausgeführt.

Optional<String> nullableString = Optional.ofNullable("banana");

Optional<String> filtering = nullableString.filter(str -> str.length() > 5);
filtering.isPresent();
// true

filtering.orElse("other");
// banana

Wenn der vom optionalen Objekt gehaltene Wert null ist oder wenn der Prädikatverarbeitungsblock false zurückgibt, wird ein leeres optionales Objekt zurückgegeben.

Optional<String> nullableString = Optional.ofNullable("apple");
// Optional<String> nullableString = Optional.ofNullable(null);

Optional<String> filtering = nullableString.filter(str -> str.length() > 5);
filtering.isPresent();
// false

filtering.orElse("other");
// other

map

Wenn der vom optionalen Objekt gehaltene Wert nicht null ist, wird der im Argument angegebene Verarbeitungsblock der Funktion mit diesem Wert ausgeführt.

Optional<String> nullableString = Optional.ofNullable("apple");
Optional<Integer> mapping = nullableString.map(str -> str.length());

mapping.isPresent();
// true

mapping.orElse(0);
// 5

Wenn der vom optionalen Objekt gehaltene Wert null ist oder wenn der Verarbeitungsblock der Funktion null zurückgibt, wird ein leeres optionales Objekt zurückgegeben.

Optional<String> nullableString = Optional.ofNullable(null);
Optional<Integer> mapping = nullableString.map(str -> str.length());

mapping.isPresent();
// false

mapping.orElse(0);
// 0

flatMap

Wenn der vom optionalen Objekt gehaltene Wert nicht null ist, wird der im Argument angegebene Verarbeitungsblock der Funktion mit diesem Wert ausgeführt. Der Unterschied zur Karte besteht darin, dass die Funktion ein optionales Objekt zurückgibt.

Die in map angegebene Funktion nimmt den Typ T an und gibt den Typ U zurück.

Function<? super T,? extends U> mapper

Die in flatMap angegebene Funktion nimmt den Typ T an und gibt den optionalen Typ zurück.

Function<? super T,Optional<U>> mapper
Optional<Long> optId = Optional.of(1L);
Optional<String> optName = Optional.of("john");

Optional<Employee> result = optId.flatMap(id -> optName.flatMap(name -> Optional.of(new Employee(id, name))));

result.isPresent();
// true

result.orElse(null);
// Employee{id=1, name='john'}

Wenn der vom optionalen Objekt gehaltene Wert null ist, wird ein leeres optionales Objekt zurückgegeben.

Optional<Long> optId = Optional.of(1L);
Optional<String> optName = Optional.ofNullable(null);

Optional<Employee> result = optId.flatMap(id -> optName.flatMap(name -> Optional.of(new Employee(id, name))));

result.isPresent();
// false

result.orElse(null);
// null

Wenn Sie eine Funktion verwenden, die Optional in Map zurückgibt, ist der Rückgabewert ein unerwarteter Typ.

Optional<Optional<String>> nullableName = employee.map(emp -> Optional.ofNullable(emp.getName()));

API in Java 9 hinzugefügt

ifPresentOrElse

Es gibt weitere Variationen von ifPresent. Wenn der vom optionalen Objekt gehaltene Wert null ist, wird der im Argument angegebene ausführbare Verarbeitungsblock ausgeführt.

Optional<Employee> employee = Optional.ofNullable(null);

employee.ifPresentOrElse((e) -> {
    e.setName(e.getName().toUpperCase());
    System.out.println(e);
},
() -> {
    System.out.println("empty action");
    // empty action
});

or

Wenn der Wert des optionalen Objekts null ist, wird das optionale Objekt zurückgegeben, das vom im Argument angegebenen Lieferanten generiert wurde. Eine Ausnahme wird ausgelöst, wenn der Lieferant null zurückgibt.

String str = null;
Optional<String> nonNullString = Optional.ofNullable(str).or(() -> Optional.of("nonNull"));

nonNullString.isPresent();
// true

nonNullString.get();
// nonNull

stream

Wenn der vom optionalen Objekt gehaltene Wert nicht null ist, wird ein Stream mit nur diesem Wert zurückgegeben, und wenn er null ist, wird ein leerer Stream zurückgegeben.

List<Optional<String>> list = List.of(
    Optional.of("a"),
    Optional.of("b"),
    Optional.of("c"),
    Optional.empty(),
    Optional.of("e"),
    Optional.empty(),
    Optional.of("g")
);

list.stream().filter(Optional::isPresent).map(Optional::get).forEach(System.out::println);
// a
// b
// c
// e
// g

//Bei Verwendung von Stream
list.stream().flatMap(Optional::stream).forEach(System.out::println);
// a
// b
// c
// e
// g

API in Java 10 hinzugefügt

  • Modul: java.base
  • Paket: java.util

orElseThrow

Gibt den Wert zurück, der vom optionalen Objekt gehalten wird. Wenn der beizubehaltende Wert null ist, wird eine NoSuchElementException ausgelöst. Dieses Verhalten entspricht der get-Methode. Aus diesem Grund wird keine Variation von orElseThrow mit demselben Methodennamen aus Java 1.8 hinzugefügt

java1.8_orElseThrow-Signatur


public <X extends Throwable> T orElseThrow​(Supplier<? extends X> exceptionSupplier)
    throws X extends Throwable

Es fühlt sich wie eine Methode an, die die get-Methode ersetzt, wodurch Mehrdeutigkeiten aus dem get-Methodennamen entfernt werden.

java1.8_Unterschrift bekommen


public T get()

Sie können sehen, dass orElseThrow eine Ausnahme vom Methodennamen auslösen kann.

java10_orElseThrow-Signatur


public T orElseThrow()

API in Java 11 hinzugefügt

isEmpty

java11_isEmpty Signatur


public boolean isEmpty()

Gibt true zurück, wenn der Wert nicht vorhanden ist.

API in Java 12 hinzugefügt

Es wurde keine API hinzugefügt.

API in Java 13 hinzugefügt

Es wurde keine API hinzugefügt.

API in Java 14 hinzugefügt

Es wurde keine API hinzugefügt.

Andere Überprüfungsnotizen

Recommended Posts

Überprüfen Sie die Notizen für die Klasse java.util.Optional
Überprüfen Sie die Notizen für die Klasse java.util.Scanner
Ein Überprüfungshinweis für die Klasse java.util.Objects
Überprüfen Sie die Notizen für das Paket java.time.temporal
Ein Hinweis zur libGDX Utils-Klasse
Hinweise zum Umfang
Ein Hinweis zum Initialisieren von Feldern im Java-Lernprogramm
Eine Übersicht über die Spring Framework Resource-Oberfläche
Ein Murmeln über die Utility-Klasse
Hinweise für diejenigen, die mit JMockit leben
Ein Hinweis, wenn der Heroku-Befehl nicht mehr verfügbar ist
Ein kurzer Überblick über Java, das im Unterricht gelernt wurde
Ein Memo über den Fluss von Rails und Vue
Behebung des Problems des langsamen Direktzugriffs für linkedList, eine Auflistungstypklasse
[Für Anfänger] Wo kann überprüft werden, wann eine Klasse zur Kompilierungszeit nicht gefunden werden kann?
Eine Überprüfung des von Rails-Anfängern verwendeten Codes
Ich habe ein Check-Tool für das Release-Modul erstellt
Ein kurzer Überblick über Java, das in Klasse 4 gelernt wurde
Ich habe den lesbaren Code gelesen, machen Sie sich also eine Notiz
[Ruby / Rails] Legen Sie einen eindeutigen (eindeutigen) Wert in der Klasse fest
Ein kurzer Überblick über Java, das in Klasse 3 gelernt wurde
Ein kurzer Überblick über Java, das in Klasse 2 gelernt wurde
Wie erstelle ich einen MOD für Slay the Spire?
Informationen zur StringBuilder-Klasse
Anmerkung Nr. 6 "Berechnen Sie die Formel für die als Zeichenfolge empfangene einstellige Summendifferenz" [Java]
Überprüfung der Java-Innenklasse
Verschachtelte Klasse (für mich)
SDWebImage: So löschen Sie den Cache für eine bestimmte UIImageView
Ein Hinweis zum Seed-Feature von Ruby on Rails
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
Ich möchte dem select-Attribut einen Klassennamen geben
Ich habe Randoop untersucht, einen JUnit-Testklassengenerator für Java.
Ein Memorandum, um den juckenden Ort für Java Gold zu erreichen
Ein grundlegendes Verständnis des Flusses der rekursiven Verarbeitung anstreben
Eine 25-tägige Überprüfung und zukünftige Bemühungen für NRI Open Standias Schlüsselumhang
Mit der Software, die ich schon lange mache ...
Erstmaliges Modellieren von Digimon mit DDD Teil 1