English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
класс Optional был введен в Java 8, введение класса Optional значительно улучшило решение проблемы NullPointerException. В java 9 добавлены три метода для улучшения его функциональности:
stream()
ifPresentOrElse()
or()
Грамматика
public Stream<T> stream()
функция stream преобразует Optional в поток, если в Optional содержится значение, то возвращается поток, содержащий это значение, в противном случае возвращается пустой поток (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")); //фильтровать список на основе того, чтобы напечатать непустые значения //если Optional не пуст, получите значение в потоке, в противном случае верните пустой поток List<String> filteredList = list.stream() .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty()) .collect(Collectors.toList()); //Optional::stream метод вернет поток либо одного //or zero element if data is present or not. List<String> filteredListJava9 = list.stream() .flatMap(Optional::stream) .collect(Collectors.toList()); System.out.println(filteredList); System.out.println(filteredListJava9); } }
Результат выполнения вывода:
[A, B] [A, B]
Грамматика
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
Улучшение метода ifPresentOrElse — наличие else, который принимает два параметра Consumer и Runnable.
Цель метода ifPresentOrElse — это вызов функции action для значения, содержащегося в Optional, то есть action.accept(value), что совпадает с ifPresent; разница в том, что у ifPresentOrElse есть второй параметр emptyAction — если Optional не содержит значения, then ifPresentOrElse вызовет emptyAction, то есть 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("Значение: " + x),() -> System.out.println("Отсутствует.")); optional = Optional.empty(); optional.ifPresentOrElse( x -> System.out.println("Значение: " + x),() -> System.out.println("Отсутствует.")); } }
Результат выполнения вывода:
Значение: 1 Отсутствует.
Грамматика
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
Если значение существует, возвращается значение, указанное в Optional,否则 возвращается предварительно определенное значение.
import java.util.Optional; import java.util.function.Supplier; public class Tester { public static void main(String[] args) { Optional<String> optional1 = Optional.of("Море"); Supplier<Optional<String>> supplierString = () -> Optional.of("Не присутствует"); optional1 = optional1.or(supplierString); optional1.ifPresent(x -> System.out.println("Значение: " + x)); optional1 = Optional.empty(); optional1 = optional1.or(supplierString); optional1.ifPresent(x -> System.out.println("Значение: " + x)); } }
Результат выполнения вывода:
Значение: Море Значение: Не присутствует