'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.

Dims
la source
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).

Andy Turner
la source
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).

Andrew Tobilko
la source
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")
}
Annonce Yakup
la source
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).

Erwin Smout
la source