Класс Optional в Java 8

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


Класс Optional — это объект-контейнер, который может быть null. Если значение существует, метод isPresent() возвращает true, а вызов метода get() возвращает объект.

Optional — это контейнер: он может содержать значение типа T или просто null. Optional предоставляет много полезных методов, поэтому нам не нужно явно выполнять проверки на null.

Введение класса Optional эффективно решает проблему исключения нулевого указателя.

Объявление класса

Ниже приведено объявление классаjava.util.Optional<T>:

public final class Optional<T> extends Object

Методы класса

Порядковый номер Метод и описание
1 static <T> Optional<T> empty()

Возвращает пустой экземпляр Optional.

2 boolean equals(Object obj)

Определяет, равен ли другой объект Optional.

3 Optional<T> filter(Predicate<? super <T> predicate)

Если значение существует и соответствует заданному предикату, возвращает Optional, описывающий это значение; в противном случае возвращает пустой Optional.

4 <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)

Если значение существует, возвращает значение на основе метода отображения, содержащегося в Optional; в противном случае возвращает пустой Optional.

5 T get()

Если значение содержится в этом Optional, возвращает значение; в противном случае выбрасывает исключение: NoSuchElementException

6 int hashCode()

Возвращает хеш-код присутствующего значения или 0, если значение отсутствует.

7 void ifPresent(Consumer<? super T> consumer)

Если значение присутствует, вызывает consumer с этим значением; в противном случае ничего не делает.

8 boolean isPresent()

Метод возвращает true, если значение присутствует, в противном случае возвращает false.

9 <U>Optional<U> map(Function<? super T,? extends U> mapper)

Если значение присутствует, применяет к нему функцию отображения и получает возвращаемое значение. Если возвращаемое значение не null, создаёт Optional, содержащий отображённое возвращаемое значение, как возвращаемое значение метода map; в противном случае возвращает пустой Optional.

10 static <T> Optional<T> of(T value)

Возвращает Optional с указанным значением, не равным null.

11 static <T> Optional<T> ofNullable(T value)

Если значение не равно null, возвращает Optional, описывающий указанное значение; в противном случае возвращает пустой Optional.

12 T orElse(T other)

Если значение присутствует, возвращает значение; в противном случае возвращает other.

13 T orElseGet(Supplier<? extends T> other)

Если значение присутствует, возвращает значение; в противном случае вызывает other и возвращает результат вызова other.

14 <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

Если значение присутствует, возвращает содержащееся значение; в противном случае выбрасывает исключение, предоставленное Supplier.

15 String toString()

Возвращает не null строку Optional, используемую для отладки.

Примечание:Эти методы наследуются изjava.lang.Objectкласса.


Экземпляр Optional

Мы можем лучше понять использование класса Optional с помощью следующих примеров:

Файл Java8Tester.java

import java.util.Optional; public class Java8Tester { public static void main(String args[]){ Java8Tester java8Tester = new Java8Tester(); Integer value1 = null; Integer value2 = new Integer(10); //Optional.ofNullable - позволяет передавать параметры null Optional<Integer> a = Optional.ofNullable(value1); //Optional.of - выбрасывает NullPointerException, если переданный параметр равен null Optional<Integer> b = Optional.of(value2); System.out.println(java8Tester.sum(a,b)); } public Integer sum(Optional<Integer> a, Optional<Integer> b){ //Optional.isPresent - определяет, существует ли значение System.out.println("Значение первого параметра присутствует:" + a.isPresent()); System.out.println("Значение второго параметра присутствует:" + b.isPresent()); //Optional.orElse — Если значение присутствует, возвращает его; в противном случае возвращает значение по умолчанию. Integer value1 = a.orElse(new Integer(0)); //Optional.get — Получает значение; значение должно присутствовать. Integer value2 = b.get(); return value1 + value2; } }

Выполнение приведённого выше скрипта даёт следующий вывод:

$ javac Java8Tester.java 
$ java Java8Tester
第一个参数值存在: false
第二个参数值存在: true
10

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

Другие расширения