Null-монада в Java. Часть 2 | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Python Developer. Professional
-3%
Разработчик на Spring Framework
-5%
iOS Developer. Professional
-8%
Golang Developer. Professional
-6%
Базы данных
-12%
Agile Project Manager
-5%
Android Developer. Professional
-11%
Microservice Architecture
-5%
C++ Developer. Professional
-5%
Highload Architect
-6%
JavaScript Developer. Basic
-8%
Backend-разработчик на PHP
-9%
Разработчик IoT
-13%
PostgreSQL
-8%
Подготовка к сертификации Oracle Java Programmer (OCAJP) Framework Laravel Cloud Solution Architecture Reverse-Engineering. Professional Архитектура и шаблоны проектирования Node.js Developer Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes iOS Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool"
Инфраструктура
DevOps практики и инструменты
-12%
Базы данных
-12%
Network engineer. Basic
-10%
Network engineer
-4%
Экcпресс-курс «ELK»
-10%
Инфраструктурная платформа на основе Kubernetes
-6%
Administrator Linux.Basic
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Дизайн сетей ЦОД
-13%
PostgreSQL
-8%
Разработчик программных роботов (RPA) на базе UiPath и PIX Reverse-Engineering. Professional Внедрение и работа в DevSecOps Administrator Linux. Advanced Infrastructure as a code in Ansible Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Экспресс-курс «IaC Ansible»
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Null-монада в Java. Часть 2

Java_Deep_11.3_site-5020-cba9fc.png

В первой части мы рассмотрели случай, когда Null-монаду, т. е. Optional, разумно применить в программах на Java. В этот раз давайте посмотрим на некоторые детали использования.

Начнём с вариантов создания

Мы уже рассмотрели варианты Optional.ofNullable – это хороший способ создать Optional, если значение допустимо. Если Optional не может содержать Null, то можно использовать Optional.of. В этом случае прямо при создании Optional будет выполнена проверка значения на null, а при попытке передать null будет выброшено исключение.

Если требуется установить null, но нужно сделать это «осознанно» (т. е. сообщить, что в Optional мы явно помещаем значение null), следует использовать Optional.empty() как в примере из первой части. Optional готов и его можно использовать.

Часто можно встретить такой код:

public Optional<String> mayBeNullOptional() {
return Optional.ofNullable("test");
//return Optional.ofNullable(null);
// return Optional.empty();
}
public void useMayBeNullOptional() {
Optional<String> value = mayBeNullOptional();
if (value.isPresent() ) {
System.out.println("value:" + value.get());
} else {
System.out.println("value is empty");
}
}

isPresent работает как ожидается, однако это не соответствует стилю использования Optional. Вариант лучше будет выглядеть так:

public void useMayBeNullOptional() {
Optional<String> value = mayBeNullOptional();
System.out.println(
value.map(val -> "value:" + value.get())
.orElse("value is empty"));
}

Если требуется из Optional извлечь значение, то можно сразу предусмотреть вариант на случай отсутствия значения. Можно вернуть константу как в примере ниже:

public void useMayBeNullOptional() {
Optional<String> value = mayBeNullOptional();
String strFromOptional = value.orElse("null str");
System.out.println(strFromOptional);
}

А можно выполнить другую функцию (эта возможность появилась в java9):

public void useMayBeNullOptional() {
Optional<String> value = mayBeNullOptional();
String strFromOptional = value.or(() -> Optional.of("null str")).get();
System.out.println(strFromOptional);
}

Optional можно и даже нужно включить в stream обработчиков. Например, так:

public void useMayBeNullOptional() {
Optional<String> value = mayBeNullOptional();
List<String> list = value.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println(list);
}

Тут важно отметить, что даже если mayBeNullOptional вернёт empty, то NPE не произойдёт.

Делаем выводы

Optional – очень удобный функционал для работы со значениями. Это хороший пример null-монады. В мире функционального программирования кроме null-монады есть ещё одна очень интересная штука – try-монада. Она нужна для упрощения работы с исключениями. Как Try-монаду использовать в java мы поговорим в следующий раз…

Есть вопрос? Напишите в комментариях!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться