'Optional.get ()' без проверки 'isPresent ()'

88

У меня есть следующий код поиска на Java:

return getTableViewController().getMe().getColumns().stream().filter($->Database.equalsColumnName($.getId(), columnId)).findFirst().get();

Я хотел найти столбец по имени и вернуть первый найденный.

Я так понимаю, бывает, что ничего не найдено и его нужно обрабатывать, но как?

Это то, чего он хочет от этой ругани:

'Optional.get()' without 'isPresent()' check

?

Как исправить? Я хочу вернуться, nullесли ничего не найдено.

ОБНОВИТЬ

Ладно, ладно, я просто не осознавал, что это findFirst()возвращается Optional.

Тускнеет
источник
2
Обратите внимание, что вы не должны использовать $в качестве идентификатора в Java: JLS Sec 3.8 : «Знак $ следует использовать только в механически сгенерированном исходном коде или, в редких случаях, для доступа к уже существующим именам в устаревших системах».
Энди Тернер,

Ответы:

179

Заменить get()на orElse(null).

Энди Тернер
источник
1
Зачем? :) Почему orElseначинается с «или»?
Dims
15
Потому что это название метода. И elseэто ключевое слово.
Энди Тернер
8
@Dims - это всего лишь короткая форма getOrElse, просто опуская get. С опцией вы обычно должны использовать orElseвместо, getпотому что getвызовет исключение, если значение равно нулю.
Пухлен 02
4
@puhlen orElseGet()берет a Supplier<T>, тогда как orElse()берет T. Они не эквивалентны.
bcsb1001 02
1
@ bcsb1001 это не то, что он пытался сказать, "getOrElse" - это имя, которое он придумал, чтобы объяснить цель orElse; orElseGetв его комментарии нет упоминания ;)
Rorrim
22
...findFirst().orElse(null);

Возвращает значение, если оно присутствует, в противном случае возвращает null. В документации написано, что переданный параметр может быть null(что запрещено orElseGetи orElseThrow).

Андрей Тобилко
источник
1
отчасти это правда. findFirst () имеет следующее правило: «Когда нет порядка встречи, он возвращает любой элемент из потока». -> поэтому, если ваш фильтр не возвращает соответствующий элемент, findFirst () вернет первый (за исключением того, что поток заранее пуст)
Fl0R1D3R 01
1

мое решение было проверить это таким образом

if(item.isPresent()){
  item.get().setId("1q2w3e4r5t6y")
}
Якуп Ад
источник
0

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

Удалите .get (), верните сам Optional и заставьте вызывающий код обрабатывать его соответствующим образом (так же, как это должно было бы быть в случае, если бы вы возвращали null).

Эрвин Смаут
источник