'Optional.get ()' sans vérification 'isPresent ()'


88

J'ai le code de recherche suivant en Java:

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

Je souhaitais trouver la colonne par nom et renvoyer la première trouvée.

Je comprends qu'il y a un cas où rien n'a été trouvé et que cela devrait être traité, mais comment?

Est-ce ce qu'il veut en jurant:

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

?

Comment réparer? Je souhaite revenir nullsi rien n'a été trouvé.

MISE À JOUR

D'accord, d'accord, je n'avais tout simplement pas réalisé, ça findFirst()revient Optional.


2
Notez que vous ne devez pas utiliser $comme identifiant en Java: JLS Sec 3.8 : "Le signe $ ne doit être utilisé que dans le code source généré mécaniquement ou, rarement, pour accéder aux noms préexistants sur les systèmes hérités."
Andy Turner

Réponses:


179

Remplacez get()par orElse(null).


1
Pourquoi? :) Pourquoi orElsecommence par "ou"?
Dims

15
Parce que c'est le nom de la méthode. Et elsec'est un mot-clé.
Andy Turner

8
@Dims c'est juste une forme courte de getOrElse, laissant de côté le get. Avec facultatif, vous devriez normalement utiliser à la orElseplace de getcar getcela lèvera une exception si la valeur est nulle.
puhlen

4
@puhlen orElseGet()prend un Supplier<T>, alors que orElse()prend un T. Ce ne sont pas des équivalents.
bcsb1001

1
@ bcsb1001 ce n'est pas ce qu'il a essayé de dire, "getOrElse" est un nom qu'il a inventé pour expliquer le but de orElse; il n'y a aucune référence orElseGetdans son commentaire;)
Rorrim

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

Renvoie la valeur si présente, sinon renvoie null. La documentation dit que le paramètre passé peut être null(ce qui est interdit pour orElseGetet orElseThrow).


1
c'est en partie vrai. findFirst () a la règle suivante: "Quand il n'y a pas d'ordre de rencontre, il renvoie n'importe quel élément du Stream." -> donc si votre filtre ne retourne pas l'élément correspondant, findFirst () retournera le premier (sauf que le flux est vide au préalable)
Fl0R1D3R

1

ma solution était de le vérifier de cette façon

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

0

Une option a été créée pour que le code puisse, après toutes ces décennies, enfin commencer à éviter la valeur null.

Supprimez le .get (), renvoyez le facultatif lui-même et faites en sorte que le code appelant le traite de manière appropriée (tout comme il devrait le faire dans le cas où vous retourneriez null).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.