Руководство по Java 9. Улучшения в классе Optional.

В данной статье мы рассмотрим улучшения, касающиеся класса Optional в Java 9.

Изначально, данный класс был добавлен в Java 8 для избежания проверок на null и NullPointerException.

В Java 9 были добавлены новые методы:

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

Рассмотрим каждый из них по порядку.

Метод ifPresentOrElse()

Данный метод имеет следующий синтаксис:


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

Его суть заключается в том, что если значение есть, то выполняется одно действие, если нет, то выполняется другое действие.

Для понимания того, как это работает на практике, рассмотрим простой пример:


package net.proselyte.java9.optional;

import java.util.Optional;

public class OptionalIfPresentOrElseDemo {
    public static void main(String[] args) {
        Optional optional = Optional.empty();

        optional.ifPresentOrElse(value -> System.out.println("Value: " + value),
                () -> System.out.println("There is no value..."));

        optional = Optional.of("This is test string");

        optional.ifPresentOrElse(value -> System.out.println("Value: " + value),
                () -> System.out.println("There is no value..."));
    }
}

В результате выполнения данной программы, мы получим следующий результат:


There is no value...
Value: This is test string

Метод stream()

Синтаксис данного метода:


public Stream stream()

Если значение есть, то мы получаем поток, которые содержит только это значение, в противно случае – мы получаем пустой поток.
Рассмотрим простой пример:


package net.proselyte.java9.optional;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class OptionalStreamDemo {
    public static void main(String[] args) {
        List<optional> optionalList = Arrays.asList(
                Optional.of(1),
                Optional.of(2),
                Optional.empty(),
                Optional.of(3),
                Optional.empty()
        );

        List filteredIntegerList = optionalList.stream()
                .flatMap(Optional::stream)
                .collect(Collectors.toList());

        System.out.println("filteredIntegerList: " + filteredIntegerList);
    }
}

В результате работы этой программы, мы получим следующий результат:


filteredIntegerList: [1, 2, 3]

Метод or()

Данный метод имеет следующий синтаксис:


public Optional or(Supplier<? extends Optional<? extends T>> supplier)

Если значение есть, то мы возвращаем Optional, который описывает значение, если нет, то Optional, порождённый переданной функцией.

Для понимания того, как это работает на практике, рассмотрим, простой пример:


package net.proselyte.java9.optional;

import java.util.Optional;
import java.util.function.Supplier;

public class OptionalOrDemo {
    public static void main(String[] args) {
        Optional optionalInteger = Optional.of(1000);

        Supplier<optional> optionalSupplierInteger = () -> Optional.of(-1000);

        optionalInteger = optionalInteger.or(optionalSupplierInteger);
        optionalInteger.ifPresent(optionalValue -> System.out.println("Optional value: " + optionalValue));

        optionalInteger = Optional.empty();

        optionalInteger = optionalInteger.or(optionalSupplierInteger);
        optionalInteger.ifPresent(optionalValue -> System.out.println("Optional value: " + optionalValue));
    }
}

В результате выполнения данной программы мы получим следующий результат:


Optional value: 1000
Optional value: -1000

На этом мы заканчиваем обзор улучшений, касающихся класс Optional в Java 9.

В следующей статье мы рассмотрим поддержку HTTP 2.