English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Optional 类在 Java 8 中引入,Optional 类的引入很好地解决空指针异常。。在 java 9 中, 添加了三个方法来改进它的功能:
stream()
ifPresentOrElse()
or()
Syntax
public Stream<T> stream()
stream 方法的作用就是将 Optional 转为一个 Stream,如果该 Optional 中包含值,那么就返回包含这个值的 Stream,否则返回一个空的 Stream(Stream.empty())。
import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; public class Tester { public static void main(String[] args) { List<Optional<String>> list = Arrays.asList ( Optional.empty(), Optional.of("A"), Optional.empty(), Optional.of("B")); //filter the list based to print non-empty values //if optional is non-empty, get the value in stream, otherwise return empty List<String> filteredList = list.stream() .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty()) .collect(Collectors.toList()); //Optional::stream Methode wird einen Stream von entweder einem oder keinem Element zurückgeben //oder null, wenn der Datenbestand vorhanden ist oder nicht. List<String> filteredListJava9 = list.stream() .flatMap(Optional::stream) .collect(Collectors.toList()); System.out.println(filteredList); System.out.println(filteredListJava9); } }
Ausführungsergebnis:
[A, B] [A, B]
Syntax
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
Die Verbesserung der Methode ifPresentOrElse ist die Verfügbarkeit von else, das zwei Parameter Consumer und Runnable annimmt.
Die Verwendung der Methode ifPresentOrElse ist so, dass, wenn ein Optional einen Wert enthält, die Funktion action auf den enthaltenen Wert aufgerufen wird, d.h. action.accept(value), was mit ifPresent übereinstimmt; der Unterschied zur Methode ifPresent besteht darin, dass ifPresentOrElse einen zweiten Parameter emptyAction hat - wenn der Optional keinen Wert enthält, ruft ifPresentOrElse emptyAction auf, d.h. emptyAction.run().
import java.util.Optional; public class Tester { public static void main(String[] args) { Optional<Integer> optional = Optional.of(1); optional.ifPresentOrElse( x -> System.out.println("Wert: " + x),() -> System.out.println("Nicht vorhanden.")); optional = Optional.empty(); optional.ifPresentOrElse( x -> System.out.println("Wert: " + x),() -> System.out.println("Nicht vorhanden.")); } }
Ausführungsergebnis:
Wert: 1 Nicht vorhanden.
Syntax
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
Wenn der Wert existiert, wird der von Optional angegebene Wert zurückgegeben, andernfalls wird ein vorgegebener Wert zurückgegeben.
import java.util.Optional; import java.util.function.Supplier; public class Tester { public static void main(String[] args) { Optional<String> optional1 = Optional.of("Meer"); Supplier<Optional<String>> supplierString = () -> Optional.of("Nicht vorhanden"); optional1 = optional1.or( supplierString); optional1.ifPresent( x -> System.out.println("Wert: " + x)); optional1 = Optional.empty(); optional1 = optional1.or( supplierString); optional1.ifPresent( x -> System.out.println("Wert: " + x)); } }
Ausführungsergebnis:
Wert: Meer Wert: Nicht vorhanden