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ć, null
jeśli nic nie znaleziono.
AKTUALIZACJA
Okej, okej, po prostu nie zdawałem sobie sprawy, że to findFirst()
wraca Optional
.
java
java-8
java-stream
optional
Dims
źródło
źródło
$
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."Odpowiedzi:
Wymień
get()
sięorElse(null)
.źródło
orElse
zaczyna się od „lub”?else
jest słowem kluczowym.orElse
zamiast,get
ponieważget
zgłosi wyjątek, jeśli wartość jest równa null.orElseGet()
zajmuje aSupplier<T>
, podczas gdyorElse()
zajmujeT
. Nie są one równoważne.orElse
; nie ma odniesieniaorElseGet
w jego komentarzu;)...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 zabronioneorElseGet
iorElseThrow
).źródło
moim rozwiązaniem było sprawdzenie tego w ten sposób
if(item.isPresent()){ item.get().setId("1q2w3e4r5t6y") }
źródło
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).
źródło