„Optional.get ()” bez czeku „isPresent ()”


88

Mam następujący kod wyszukiwania w Javie:

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

Chciałem znaleźć kolumnę według nazwy i zwrócić pierwszą znalezioną.

Rozumiem, że jest przypadek, w którym nic nie znaleziono i należy to przetworzyć, ale jak?

Czy tego właśnie chce przez to przekleństwo:

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

?

Jak naprawić? Chcę wrócić, nulljeśli nic nie znaleziono.

AKTUALIZACJA

Okej, okej, po prostu nie zdawałem sobie sprawy, że to findFirst()wraca Optional.


2
Zauważ, że nie powinieneś używać $jako identyfikatora w Javie: JLS Sec 3.8 : "Znak $ powinien być używany tylko w mechanicznie generowanym kodzie źródłowym lub, rzadko, w celu uzyskania dostępu do wcześniej istniejących nazw w starszych systemach."
Andy Turner

Odpowiedzi:


179

Wymień get()się orElse(null).


1
Czemu? :) Dlaczego orElsezaczyna się od „lub”?
Przyciemnia

15
Ponieważ to nazwa metody. I elsejest słowem kluczowym.
Andy Turner

8
@Dims to tylko krótka forma getOrElse, po prostu pomijająca get. Z opcjonalnym zwykle należy używać orElsezamiast, getponieważ getzgłosi wyjątek, jeśli wartość jest równa null.
puhlen

4
@puhlen orElseGet()zajmuje a Supplier<T>, podczas gdy orElse()zajmuje T. Nie są one równoważne.
bcsb1001

1
@ bcsb1001 to nie jest to, co próbował powiedzieć. „getOrElse” to nazwa, którą wymyślił, aby wyjaśnić cel orElse; nie ma odniesienia orElseGetw jego komentarzu;)
Rorrim

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

Zwraca wartość, jeśli jest obecna, w przeciwnym razie zwraca null. Dokumentacja mówi, że przekazany parametr może być null(co jest zabronione orElseGeti orElseThrow).


1
to częściowo prawda. Funkcja findFirst () ma następującą regułę: „Gdy nie ma kolejności napotkania, zwraca dowolny element ze strumienia”. -> więc jeśli twój filtr nie zwraca dopasowanego elementu, findFirst () zwróci pierwszy (z wyjątkiem tego, że strumień jest wcześniej pusty)
Fl0R1D3R

1

moim rozwiązaniem było sprawdzenie tego w ten sposób

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

0

Opcjonalny został utworzony, aby po tych wszystkich dziesięcioleciach kod mógł wreszcie zacząć unikać null.

Usuń .get (), zwróć samą wartość Optional i spraw, aby kod wywołujący zajął się nim odpowiednio (tak jak musiałoby to zrobić w przypadku zwracania wartości null).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.