Перевірка 'Optional.get ()' без 'isPresent ()'


89

У мене є такий код пошуку на 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 : "Знак $ слід використовувати лише в механічно сформованому вихідному коді або, рідко, для доступу до вже існуючих імен у застарілих системах."
Енді Тернер,

Відповіді:


180

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


1
Чому? :) Чому orElseпочинається з "або"?
Dims

15
Тому що це назва методу. І elseє ключовим словом.
Енді Тернер

8
@Dims - це лише коротка форма getOrElse, просто не згадуючи get. З необов'язковим ви зазвичай використовуєте orElseзамість, getоскільки getвикине виняток, якщо значення є нульовим.
puhlen

4
@puhlen orElseGet()приймає a Supplier<T>, тоді як orElse()бере a T. Вони не є рівнозначними.
bcsb1001

1
@ bcsb1001 це не те, що він намагався сказати, "getOrElse" - це ім'я, яке він вигадав, щоб пояснити мету orElse; orElseGetу його коментарі немає посилання ;)
Роррім,

22
...findFirst().orElse(null);

Повертає значення, якщо воно є, інакше повертає null. У документації сказано, що переданим параметром може бути null(що заборонено для orElseGetта orElseThrow).


1
це частково правда. findFirst () має таке правило: "Коли немає порядку зустрічей, він повертає будь-який елемент із потоку." -> отже, якщо ваш фільтр не повертає відповідний елемент, findFirst () поверне перший (за винятком того, що потік попередньо порожній)
Fl0R1D3R

1

моє рішення було перевірити це таким чином

if(item.isPresent()){
  item.get().setId("1q2w3e4r5t6y")
}

0

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

Видаліть .get (), поверніть сам Необов’язковий і зробіть так, щоб викличний код справлявся з ним (так само, як це було б потрібно робити у випадку, якщо ви повертаєте нуль).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.