Null-монада в Java. Часть 1
В программировании часто возникает задача вернуть из функции какое-нибудь значение.
Что делать со значением понятно – его надо просто вернуть. А что делать, если значения в таблице нет?
Рассмотрим варианты действий
Итак, у нас есть несколько вариантов:
Можно устанавливать специальный код ошибки, а потом его проверять. Такой подход широко практиковался в языке Си. Понятно, что сейчас это выглядит более чем странно.
Другой вариант – выбрасывать исключение типа
Реализовывать бизнес-логику на исключениях тоже вариант ниже среднего. Поэтому, часто в таких случаях, если значение не найдено, возвращают просто null. Казалось бы, это годное решение. Однако работа с null-ами – так себе удовольствие. Надо постоянно думать про
Какие есть ещё варианты?
В ряде языков программирования эта проблема решается при помощи так называемой Null-монады. Есть такая возможность и в java. Давайте с ней познакомимся.
Допустим, у нас есть функция, которая может возвращать или строку или Null:
public String mayBeNull() { //return "test"; return null; }
Раскомментируйте нужную строку, чтобы получить нужный вариант.
Как может выглядеть код, в котором будет использоваться эта функция?
Примерно так:
public void useMayBeNull() { String value = mayBeNull(); if (value == null) { System.out.println("action with null"); } else { System.out.println("action with NOT null: " + value); } }
В принципе, получился нормальный, рабочий вариант, который часто встречается на практике. Выглядит он громоздко, некрасиво. Более того, если вместо
Давайте перепишем этот пример с использованием null-монады. В java эта концепция реализуется через класс Optional.
public Optional<String> mayBeNullOptional() { return Optional.ofNullable("test"); //return Optional.ofNullable(null); //return Optional.empty(); }
И как с этим работать:
public void useMayBeNullOptional() { Optional<String> value = mayBeNullOptional(); System.out.println( value.map(val -> "action with NOT null:" + val) .orElse("action with null")); }
Обратите внимание, что в этом случае у нас нет if-условия. Т. е. у нас нет шанса забыть про обработку значений и неожиданно получить NPE-исключение. Да и сама запись получилась более компактная, красивая и современная.
В следующей части мы посмотрим на некоторые моменты использования Optional!