Java 8 Optional
Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8. Надеемся, что данная статья Вам будет полезна. Приятного прочтения!
В этой статье мы рассмотрим опциональные типы (Optional) в Java 8
1. Введение
Optional - новый класс в пакете java.util, является контейнером (оберткой) для значений которая также может безопасно содержать null.
Благодаря опциональным типам можно забыть про проверки на null и NullPointerException.
2. Optional basics
Для создания Optional используются методы:
- Optional.of
1 2 3 4 |
public static void main(String[] args) { Optional<String> name = Optional.of("John"); System.out.println(name); //output Optional[John] } |
В метод Optional.of нельзя передавать null, если конечно мы не хотим получить NullPointerException
1 2 3 4 |
public static void main(String[] args) { Optional<String> name = Optional.of(null); // java.lang.NullPointerException System.out.println(name); } |
- Optional.ofNullable
1 2 3 4 |
public static void main(String[] args) { Optional<String> name = Optional.ofNullable("John"); System.out.println(name); //output Optional[John] } |
А вот в метод Optional.ofNullable передавать null можно безопасно
1 2 3 4 5 |
public static void main(String[] args) { String john = null; Optional<String> name = Optional.ofNullable(john); System.out.println(name); //output Optional.empty } |
- Optional.empty для создания пустого Optional
1 2 3 4 |
public static void main(String[] args) { Optional<String> emptyOptional = Optional.empty(); System.out.println(emptyOptional); //output Optional.empty } |
Для получения значения из Optional используется метод Optional.get, но он является небезопасным и может бросить NoSuchElementException
1 2 3 4 5 6 7 |
public static void main(String[] args) { Optional<String> name = Optional.of("John"); System.out.println(name.get()); //output John Optional<Object> nullOptional = Optional.ofNullable(null); System.out.println(nullOptional.get()); // java.util.NoSuchElementException: No value present } |
3. Optional isPresent, ifPresent
3.1 Optional isPresent
Метод Optional.isPresent возвращает true, если значение в нем присутствует, иначе возвращает false
1 2 3 4 5 6 7 8 9 10 11 |
public static void main(String[] args) { Optional<String> name = Optional.of("John"); if (name.isPresent()) { //условие выполнится и мы увидим имя System.out.println(name.get()); //output John } Optional<Object> empty = Optional.empty(); if (empty.isPresent()) { //условие не выполнится, значит исключения не будет System.out.println(empty.get()); } } |
Метод Optional.get лучше использовать в паре с Optional.isPresent чтобы предотвратить исключения
3.2 Optional ifPresent
Метод Optional.ifPresent выполняет переданное действие, если значение в Optional присутствует, иначе игнорирует его. Метод принимает лямбда-выражение известное как потребитель (Consumer).
1 2 3 4 5 6 7 |
public static void main(String[] args) { Optional<String> name = Optional.of("John"); name.ifPresent(val -> System.out.println(val)); //условие выполнится и мы увидим John Optional<Object> empty = Optional.empty(); empty.ifPresent(val -> System.out.println(val)); //условие не выполнится, действие игнорируется } |
4. Optional orElse
4.1 Optional orElse
Метод Optional.orElse возвращает переданное значение, если Optional пустой
1 2 3 4 5 6 7 |
public static void main(String[] args) { Optional<String> name = Optional.of("John"); System.out.println(name.orElse("blank")); //output John Optional<Object> empty = Optional.empty(); System.out.println(empty.orElse("blank")); //output blank } |
4.2 Optional orElseGet
Метод Optional.orElseGet возвращает переданное значение из лямда-выражение , если Optional пустой
1 2 3 4 5 6 7 |
public static void main(String[] args) { Optional<String> name = Optional.of("John"); System.out.println(name.orElseGet(() -> "blank")); //output John Optional<Object> empty = Optional.empty(); System.out.println(empty.orElseGet(() -> "blank")); //output blank } |
4.3 Optional orElseThrow
Метод Optional.orElseThrow бросает переданное исключение , если Optional пустой
1 2 3 4 5 6 7 8 |
public static void main(String[] args) { Optional<String> name = Optional.of("John"); String nameValue = name.orElseThrow(() -> new RuntimeException()); System.out.println(nameValue); //output John Optional<Object> empty = Optional.empty(); Object emptyValue = empty.orElseThrow(() -> new RuntimeException()); //java.lang.RuntimeException } |
5. Optional map, flatMap
5.1 Optional map
Метод Optional.map служит для преобразования значения внутри Optional. Если Optional пустой преобразование не будет происходить
1 2 3 4 5 6 7 |
public static void main(String[] args) { Optional<String> name = Optional.of("JOHN"); System.out.println(name.map(String::toLowerCase)); //output Optional[john] Optional<String> empty = Optional.empty(); System.out.println(empty.map(String::toLowerCase)); //output Optional.empty } |
5.2 Optional flatMap
Метод Optional.flatMap преобразовывает значение внутри Optional, но при этом не оборачивает их
1 2 3 4 5 6 7 8 |
public static void main(String[] args) { Optional<Optional<String>> name = Optional.of(Optional.of("JOHN")); Optional<String> lowerCaseName = name.flatMap(o -> o.map(String::toLowerCase)); System.out.println(lowerCaseName); //output Optional[john] Optional<Optional<String>> empty = Optional.of(Optional.empty()); System.out.println(empty.flatMap(o -> o.map(String::toLowerCase))); //output Optional.empty } |
В Java 8 есть еще множество полезных нововведений, которые можно найти тут
Надеемся - наша статья была Вам полезна. Есть возможность записаться на наши курсы по Java в Киеве. Детальную информацию смотрите у нас на сайте.