Класс java.util.Objects был расширен с помощью ряда новых методов
соответственно
Объекты # requireNonNullElseGet() в Java-9
.
Оба возвращают первый аргумент, если он не равен null, и в противном случае возвращает ненулевой второй аргумент или ненулевое значение поставщика .get()
jshell> String nullStr = null;
nullStr ==> null
jshell> Objects.requireNonNullElse(nullStr,"lorem ipsum");
$13 ==> "lorem ipsum"
jshell> Objects.requireNonNullElseGet(nullStr,() -> "lorem ipsum");
$14 ==> "lorem ipsum"
Но новая функциональность перекрывается с уже существующим в классе Optional
Необязательный # orElse и Дополнительно # orElseGet
jshell> Optional.ofNullable(nullStr).orElse("lorem ipsum");
$17 ==> "lorem ipsum"
jshell> Optional.ofNullable(nullStr).orElseGet(() -> "lorem ipsum");
$18 ==> "lorem ipsum"
Единственное различие между новыми методами в Objects
и соответствующими методами Optional
заключается в том, что второй аргумент или значение поставщика должны быть не равными нулю, иначе Objects
throws NPE
:
jshell> Objects.requireNonNullElseGet(nullStr,() -> null);
| java.lang.NullPointerException thrown: supplier.get()
| at Objects.requireNonNull (Objects.java:246)
| at Objects.requireNonNullElseGet (Objects.java:321)
| at (#15:1)
jshell> Objects.requireNonNullElse(nullStr,null);
| java.lang.NullPointerException thrown: defaultObj
| at Objects.requireNonNull (Objects.java:246)
| at Objects.requireNonNullElse (Objects.java:301)
| at (#16:1)
по сравнению с Optional
jshell> Optional.ofNullable(nullStr).orElse(null);
$19 ==> null
jshell> Optional.ofNullable(nullStr).orElseGet(() -> null);
$20 ==> null
- Почему разработчики JDK не обновили существующие методы в Необязательном класс?
- Почему они не представили новый метод (который будет брошен NPE, если второй аргумент равен null) в Необязательный класс?
- Что мы должны использовать теперь Необязательно или Объекты?
- Новые методы делают объекты более предпочтительными, чем Необязательно, поскольку они будет немедленно бросать NPE и не позже где-нибудь в коде например, с опцией?
Если у меня есть устаревший код, что-то вроде:
String str = null;
String result = str == null ? "other string" : str;
Это простая проверка внутри метода. И я хотел бы повторно использовать его, используя новейшие языковые возможности. Теперь, имея в виду разницу между Optional.orElse
и Objects.requireNonNullOrElse
, что предпочтительнее?
result = Optional.ofNullable(str).orElse("other string");
или
result = Objects.requireNonNullOrElse(str,"other string);