Null-монада в Java. Часть 2
В первой части мы рассмотрели случай, когда Null-монаду, т. е. Optional, разумно применить в программах на Java.
Начнём с вариантов создания
Мы уже рассмотрели варианты
Если требуется установить null, но нужно сделать это «осознанно» (т. е. сообщить, что в Optional мы явно помещаем значение null), следует использовать
Часто можно встретить такой код:
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); }
Тут важно отметить, что даже если
Делаем выводы
Optional – очень удобный функционал для работы со значениями. Это хороший пример null-монады. В мире функционального программирования кроме null-монады есть ещё одна очень интересная штука – try-монада. Она нужна для упрощения работы с исключениями. Как Try-монаду использовать в java мы поговорим в следующий раз…
Есть вопрос? Напишите в комментариях!