Улучшенный класс Optional в Java 9

Java 9 新特性Новые возможности Java 9

Класс Optional был представлен в Java 8. Появление класса Optional эффективно решает проблему исключения нулевого указателя. В Java 9 были добавлены три метода для улучшения его функциональности:

  • stream()
  • ifPresentOrElse()
  • or()

метод stream()

Синтаксис

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")); //отфильтровать список, чтобы вывести непустые значения //если optional не пуст, получить значение в stream, иначе вернуть empty List<String> filteredList = list.stream() .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty()) .collect(Collectors.toList()); //Метод Optional::stream вернёт поток, состоящий либо из одного, //либо из нуля элементов, если данные присутствуют или нет. List<String> filteredListJava9 = list.stream() .flatMap(Optional::stream) .collect(Collectors.toList()); System.out.println(filteredList); System.out.println(filteredListJava9); } }

Результат выполнения вывода:

[A, B]
[A, B]

метод ifPresentOrElse()

Синтаксис

public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

Улучшение метода ifPresentOrElse заключается в том, что у него есть блок else, принимающий два параметра: Consumer и Runnable.

Назначение метода ifPresentOrElse: если Optional содержит значение, для содержащегося значения вызывается функция action, т. е. action.accept(value), что соответствует ifPresent; отличие от метода ifPresent в том, что ifPresentOrElse также имеет второй параметр, emptyAction — если Optional не содержит значения, 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("Отсутствует.")); } }

Результат выполнения вывода:

Value: 1
Not Present.

метод or()

Синтаксис

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("Mahesh"); 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)); } }

Результат выполнения вывода:

Value: Mahesh
Value: Not Present

Java 9 新特性Новые возможности Java 9