Dies ist eine Überprüfungsnotiz der in Java 1.8 eingeführten Klasse java.util.Optional.
Umgebung
Referenz
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()));
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
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()
isEmpty
java11_isEmpty Signatur
public boolean isEmpty()
Gibt true zurück, wenn der Wert nicht vorhanden ist.
Es wurde keine API hinzugefügt.
Es wurde keine API hinzugefügt.
Es wurde keine API hinzugefügt.
Recommended Posts