Как стать автором
Обновить

Комментарии 13

Что тут у нас?
Очередная статья про новинки Java 1.8 в 2024 году!

Optional.ofNullable(value) создает Optional объект, который может содержать null.

Optional не может содержать null, в этом его суть. Если в ofNullable() передать null, то будет возвращён результат Optional.empty().

if (optional.isPresent()) { System.out.println(optional.get()); }

И вот такое, а равно как и вызов Optional::get() вообще без проверки на isPresent() перед этим, вы будете встречать частенько. Не потому, что есть хоть какая-то причина так сделать, нет. Просто вашему предшественнику было лень включать мозг и разбираться, как использовать Optional правильно.

Optional не может содержать null, в этом его суть.

да, неужели ?

public static <T> Optional<T> ofNullable(T value) {
  return value == null ? (Optional<T>) EMPTY
                             : new Optional<>(value);
}

private static final Optional<?> EMPTY = new Optional<>(null);

private Optional(T value) {
   this.value = value;
}

что такое value ? разве опшионал не хранит в себе null ?

наверное, произошла типичная подмена понятий в понимании сути

Это так в джаве определили None? :)

если none это отсутствие ссылки на объект, то да

Выглядит печально :(

Вы так торопились оставить язвительный комментарий, что совершенно забыли про то, что публичный API и детали реализации это вещи ортогональные. Ну и не поняли сути, конечно же.

Optional либо хранит ненулевое значение, либо пуст. Ни get(), ни ifPresent(), ни любой другой метод Optional не вернёт вам null в качестве значения, хрянящегося внутри. Вы можете получить null, передав его параметром в orElse(), но это будет ваш null, а не хранящееся значение.

Технически состояние «пустого» Optional реализовано через нулевое значение поля value. Но это, повторюсь, деталь реализации.

String тоже, знаете ли, всегда представляет строку в кодировке UTF-16, но далеко не всегда её в таком виде хранит.

да, извиняюсь, получилось язвительно, но тем не менее, содержит/хранит (это одно и тоже), а вот может ли он вернуть это совсем другое

Лучше бы метода get вообще не было. Или был только для Some. Тогда предшественникам и последователям поневоле пришлось бы включать мозги :)

А есть ли тип Result/Either, который либо содержит валидное значение либо ошибку? Будет ли оно автоматом оборачивать выброшенные исключения в них?

Думаю, после упоминания монадических законов стоило упомянуть и то, что Optional их нарушает.

расскажите подробнее, пожалуйста

То, как Optional работает с null, ломает закон ассоциативности и левой тождественности.

Первый гарантирует, что нет разницы выполнить на монадическом значении несколько flatMap'ов с некоторыми функциями или один с композицией этих функций. То есть в этом примере значение переменных v1 и v2 должны быть равны

var v1 = Optional.of(someValue).map(someFunction.andThen(anotherFunction));
var v2 = Optioal.of(someValue).map(someFunction).map(anotherFunction);

а это не так, если одна из функций возвращает null.

Второй гарантирует, что нет разницы между применением связывающей функции напрямую к значению или в контексте монады. То есть содержимое обеих переменных в этом примере должно быть одинаковым

Optional<SomeType> v1 = someFunction.apply(someValue);
Optional<SomeType> v2 = Optional.ofNullable(someValue).flatMap(someFunction);

а это не так, если в переменной someValue находится null.

Да простят меня коллеги за упрощения и несколько вольное использование терминологии.

Не уверен, что пример с трансформерами подходящий.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий