Lorsque j'utilise la nouvelle API Java8 streams pour trouver un élément spécifique dans une collection, j'écris du code comme ceci:
String theFirstString = myCollection.stream()
.findFirst()
.get();
Ici, IntelliJ avertit que get () est appelé sans vérifier isPresent () en premier.
Cependant, ce code:
String theFirstString = myCollection.iterator().next();
... ne donne aucun avertissement.
Y a-t-il une différence profonde entre les deux techniques, qui rend l'approche de streaming plus "dangereuse" d'une certaine manière, qu'il est crucial de ne jamais appeler get () sans appeler isPresent () en premier? En parcourant Google, je trouve des articles qui parlent de la négligence des programmeurs avec Optional <> et supposent qu'ils peuvent appeler get () à tout moment.
Le fait est que j'aime recevoir une exception aussi près que possible de l'endroit où mon code est bogué, qui dans ce cas serait l'endroit où j'appelle get () quand il n'y a aucun élément à trouver. Je ne veux pas avoir à écrire des essais inutiles comme:
Optional<String> firstStream = myCollection.stream()
.findFirst();
if (!firstStream.isPresent()) {
throw new IllegalStateException("There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>");
}
String theFirstString = firstStream.get();
... sauf s'il existe un danger à provoquer des exceptions à get () que je ne connais pas?
Après avoir lu la réponse de Karl Bielefeldt et un commentaire de Hulk, j'ai réalisé que mon code d'exception ci-dessus était un peu maladroit, voici quelque chose de mieux:
String errorString = "There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>";
String firstString = myCollection.stream()
.findFirst()
.orElseThrow(() -> new IllegalStateException(errorString));
Cela semble plus utile et deviendra probablement naturel dans de nombreux endroits. J'ai toujours l'impression de vouloir choisir un élément dans une liste sans avoir à gérer tout cela, mais cela pourrait juste être que je dois m'habituer à ce genre de constructions.