Java contient un comportement vs anyMatch
Donc, si j'ai un Name
objet et ont une ArrayList
de type Name
(names
), et je veux savoir si ma liste de noms contient un Name
objet (n
), je pourrais le faire de deux façons:
boolean exists = names.contains(n);
ou
boolean exists - names.stream().anyMatch(x -> x.equals(n));
J'ai été d'examiner si ces deux se comportent de la même et ensuite pensé à ce qui se passe si n a été attribué null
?
Pour les contient, ce que je comprends, si l'argument est null
puis il retourne true
si la liste contient null
. Comment pourrais-je atteindre cet anyMatch
- serait-il par l'utilisation de Objects.equals(x, n)
?
Si cela fonctionne, l'approche la plus efficace - est-il anyMatch
comme il peut prendre avantage de la paresse et de parallélisme?
source d'informationauteur Tranquility
Vous devez vous connecter pour publier un commentaire.
Le problème avec le flux en fonction de la version, c'est que si la collection (et donc de ses cours d'eau) contient
null
éléments, alors le prédicat va jeter unNullPointerException
quand il essaie de l'appelerequals
sur cenull
objet.Cela pourrait être évité avec
Mais il n'y a aucun avantage à attendre pour le stream sur la solution dans ce cas. Le parallélisme peut apporter un avantage pour vraiment grandes listes, mais il ne faut pas jeter négligemment dans certains
parallel()
ici et là, à supposer qu'il peut rendre les choses plus vite. Tout d'abord, vous devez clairement identifier les goulots d'étranglement.Et en termes de lisibilité, je préfère la première, classique de la solution ici. Si vous voulez vérifier si la liste des
names.contains(aParticularValue)
vous devriez faire ce qu'il lit comme de la prose et de fait, l'intention claire.Un autre avantage de la
contains
approche a été mentionné dans les commentaires et dans l'autre réponse, et c'est peut-être intéressant de mentionner ici: Si le type de lanames
collection est ultérieurement modifié, par exemple, être unHashSet
alors vous aurez le plus rapidementcontains
-vérifier (avec O(1) au lieu de O(n)) pour gratuit - sans aucune autre modification du code. La solution d'analyse de flux serait alors encore à la parcourir plus de tous éléments, ce qui pourrait avoir une baisse importante des performances.Ils doivent fournir le même résultat si
hashCode()
etequals()
sont écrits de façon raisonnable.Mais les performances peuvent être complètement différents. Pour les Listes, il ne serait pas beaucoup d'importance, mais pour HashSet
contains()
utiliserahashCode()
pour localiser l'élément et il le sera (probablement) en temps constant. Tandis qu'avec la deuxième solution, il passe en boucle sur tous les articles et appeler une fonction qui va être fait en temps linéaire.Si n est nul, en fait n'a pas d'importance, comme d'habitude
equals()
méthodes sont conscients denull
arguments.