Évitez NoSuchElementException avec Stream

J’ai le Stream suivant:

 Stream stream = stream(); T result = stream.filter(t -> { double x = getX(t); double y = getY(t); return (x == tx && y == ty); }).findFirst().get(); return result; 

Cependant, il n’y a pas toujours un résultat qui me donne l’erreur suivante:

NoSuchElementException: Aucune valeur présente

Alors, comment puis-je retourner un null s’il n’y a pas de valeur présente?

Vous pouvez utiliser Optional.orElse , c’est beaucoup plus simple que de vérifier isPresent :

 T result = stream.filter(t -> { double x = getX(t); double y = getY(t); return (x == tx && y == ty); }).findFirst().orElse(null); return result; 

Stream#findFirst() retourne un Optional qui existe spécifiquement pour que vous n’ayez pas besoin d’opérer sur null valeurs null .

Un object conteneur pouvant contenir ou non une valeur non nulle. Si une valeur est présente, isPresent() retournera true et get() renverra la valeur.

Sinon, Optional#get() lève une NoSuchElementException .

Si une valeur est présente dans cet Optional , renvoie la valeur, sinon lève NoSuchElementException .

Un Optional n’exposera jamais sa valeur s’il est null .

Si vous en avez vraiment besoin , vérifiez simplement isPresent() et renvoyez null vous-même.

 Stream stream = stream(); Optional result = stream.filter(t -> { double x = getX(t); double y = getY(t); return (x == tx && y == ty); }).findFirst(); if (result.isPresent()) return result.get(); return null; 

Une autre méthode permettant de remplacer le fichier Optional.get (qui, selon toute probabilité, dépasse les intentions de l’utilisateur avec une exception NoSuchElementException) consiste à utiliser une API plus détaillée introduite dans JDK10, appelée Optional.orElseThrow() . Dans les mots de l’auteur –

Optional.get() est une “nuisance attrayante” et est trop tentant pour les programmeurs, ce qui entraîne des erreurs fréquentes. Les gens ne s’attendent pas à ce qu’un getter jette une exception. Une API de remplacement pour Optional.get() avec une sémantique équivalente doit être ajoutée.

Remarque : – L’implémentation sous-jacente de ces deux API est identique. Toutefois, cette dernière indique plus clairement qu’une exception NoSuchElementException serait levée par défaut si la valeur absente, qui est alignée sur la propriété existante Optional.orElseThrow​(Supplier exceptionSupplier) utilisé par les consommateurs comme alternative explicite.