Как заставить `Map :: get` возвращать либо` Optional` найденного значения, либо `Optional.empty ()`

Я пытаюсь это сделать:

return Optional.of(myMap.getOrDefault(myKey, null));

На самом деле, я хочу вернуть Optional.of(foundVal), если он найден, иначе Optional.empty(). Я не верю, что Optional.of(null) приравнивается к этому. Какой синтаксис делает то, что я хочу делать?

То есть, как я могу получить карту get, чтобы вернуть правильный Optional?

Optional#ofNullable, или еще лучше, вы можете выполнить некоторые действия, если ключ отсутствует, например Map#computeIfAbsent
Rogue 01.11.2018 21:13

но подумайте об этом нуле немного, null может означать, что значение отсутствует или ключ на самом деле сопоставлен с нулем, в зависимости от вашей карты и приложения

Eugene 01.11.2018 21:14

@ Евгений - Спасибо. Да, я сам создаю карту из потока, поэтому, если значение не существует, запись также никогда не существовала бы. Тем не менее, я пытаюсь охватить все нулевые случаи.

slackwing 01.11.2018 21:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
22
3
14 486
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Почему не просто:

return Optional.ofNullable(myMap.get(myKey));

JavaDocs

Этот

Optional.of(myMap.getOrDefault(myKey, null));

или действительно

Optional.of(null);

не удалось бы с NullPointerException. Как говорится в javadoc

Throws:
NullPointerException - if value is null

Optional#ofNullable существует, когда вы не знаете, является ли значение, которое вы ему передаете, null или нет:

Parameters:
value - the possibly-null value to describe

И поскольку Map#get(Object) уже возвращает null, когда нет записи для данного ключа

Returns:
the value to which the specified key is mapped, or null if this map contains no mapping for the key

вам не нужно использовать getOrDefault со значением null по умолчанию. Вместо этого вы можете напрямую использовать

Optional.ofNullable(myMap.get(myKey));

Функциональное и однозначно слишком долгое решение:

myMap.entrySet().stream()
  .filter(it -> it.getKey().equals(myKey))
  .findFirst()
  .map(Map.Entry::getValue);

очень плохая идея, так как это не использует индекс карты и не выполняет полное сканирование карты

Cerber 26.11.2020 15:27

Другие вопросы по теме