"Optional.get ()" senza controllo "isPresent ()"


92

Ho il seguente codice di ricerca in Java:

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

Volevo trovare una colonna per nome e restituire la prima trovata.

Capisco che c'è un caso in cui non è stato trovato nulla e dovrebbe essere elaborato, ma come?

È questo ciò che vuole da questo giuramento:

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

?

Come risolvere? Desidero tornare nullse non viene trovato nulla.

AGGIORNARE

Ok, ok, semplicemente non mi ero reso conto, che findFirst()ritorna Optional.


2
Nota che non dovresti usare $come identificatore in Java: JLS Sec 3.8 : "Il segno $ dovrebbe essere usato solo nel codice sorgente generato meccanicamente o, raramente, per accedere a nomi preesistenti su sistemi legacy."
Andy Turner

Risposte:


187

Sostituisci get()con orElse(null).


1
Perché? :) Perché orElseinizia con "o"?
abbassa il

15
Perché questo è il nome del metodo. Ed elseè una parola chiave.
Andy Turner

8
@Dims è solo una forma breve di getOrElse, tralasciando il get. Con optional dovresti normalmente usare orElseinvece di getperché getgenererà un'eccezione se il valore è nullo.
puhlen

4
@puhlen orElseGet()prende un Supplier<T>, mentre orElse()prende un T. Questi non sono equivalenti.
bcsb1001

2
@ bcsb1001 non è quello che ha cercato di dire, "getOrElse" è un nome che ha inventato per spiegare lo scopo orElse; non vi è alcun riferimento orElseGetnel suo commento;)
Rorrim

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

Restituisce il valore se presente, altrimenti ritorna null. La documentazione dice che il parametro passato potrebbe essere null(cosa è proibito orElseGete orElseThrow).


1
in parte è vero. findFirst () ha la seguente regola: "Quando non c'è un ordine di incontro, restituisce qualsiasi elemento dallo Stream." -> quindi se il tuo filtro non restituisce l'elemento corrispondente, findFirst () restituirà il primo (tranne che lo stream è vuoto in precedenza)
Fl0R1D3R

1

la mia soluzione era controllarlo in questo modo

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

0

Facoltativo è stato creato in modo che il codice potesse, dopo tutti questi decenni, iniziare finalmente a evitare null.

Rimuovere .get (), restituire lo stesso Opzionale e fare in modo che il codice chiamante lo gestisca in modo appropriato (proprio come dovrebbe fare nel caso in cui si restituisca null).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.