English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Java

Java Управление потоком

Java Массив

Java Ориентированность на объекты (I)

Java Ориентированность на объекты (II)

Java Ориентированность на объекты (III)

Обработка исключений Java

Java Список (List)

Java Queue (очередь)

Java Map множество

Java Set множество

Java Вход/Выход (I/O)

Java Reader/Writer

другие темы Java

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

Java 9 новые возможности

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

  • stream()

  • ifPresentOrElse()

  • or()

метод stream()

Грамматика

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]

Метод ifPresentOrElse()

Грамматика

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
Отсутствует.

Метод 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("Море");
      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));  
   }  
}

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

Значение: Море
Значение: Не присутствует

Java 9 новые возможности