Java 9: новые методы Optional (stream, ifPresentOrElse, or)
Optional (Java 8) помогает избежать null-проверок и NPE. Java 9 добавила три метода.
stream()
public Stream<T> stream()
Если значение есть — возвращает стрим из одного элемента, иначе — пустой стрим. Удобно для flatMap.
Пример
List<Optional<String>> list = Arrays.asList(
Optional.empty(), Optional.of("A"), Optional.empty(), Optional.of("B"));
// Java 8 style
List<String> filtered = list.stream()
.flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
.collect(Collectors.toList());
// Java 9 style
List<String> filteredJava9 = list.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
// Оба дают [A, B]
ifPresentOrElse(Consumer, Runnable)
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
Если значение есть — выполняет action, иначе — emptyAction.
Пример
Optional<Integer> opt = Optional.of(1);
opt.ifPresentOrElse(
x -> System.out.println("Value: " + x),
() -> System.out.println("Not Present.")
); // Value: 1
opt = Optional.empty();
opt.ifPresentOrElse(
x -> System.out.println("Value: " + x),
() -> System.out.println("Not Present.")
); // Not Present.
or(Supplier<Optional>)
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
Если значение есть — возвращает этот Optional, иначе — результат supplier.
Пример
Optional<String> opt = Optional.of("Mahesh");
Supplier<Optional<String>> supplier = () -> Optional.of("Not Present");
opt = opt.or(supplier);
opt.ifPresent(x -> System.out.println("Value: " + x)); // Value: Mahesh
opt = Optional.empty().or(supplier);
opt.ifPresent(x -> System.out.println("Value: " + x)); // Value: Not Present
Эти методы делают работу с Optional более функциональной и выразительной.
java
- Ключевое слово final в Java: переменные, методы и классы
- Оператор instanceof в Java: полное руководство с примерами
- Статические вложенные классы в Java: использование, отличия и примеры
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Рефлексия в Java: инспекция классов, методов и полей во время выполнения
- Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
- Освоение Java Generics: создание переиспользуемого, типобезопасного кода
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление
- Java 9 Stream API Enhancements: takeWhile, dropWhile, iterate, ofNullable