Comments 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? :)
Вы так торопились оставить язвительный комментарий, что совершенно забыли про то, что публичный 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.
Да простят меня коллеги за упрощения и несколько вольное использование терминологии.
Не уверен, что пример с трансформерами подходящий.
Монады как строительные блоки функционального Java