Comment calculer le nombre de matchs sur un flux de filtre?
Comment puis-je compter les matches d'un flux de filtre? Je suis en train de refactoriser le code suivant à java8 stream
:
//java7
int i = 0;
for (Node node : response.getNodes()) {
Integer id = node.getId();
if (id != null) {
node.setContent("This is the id: " + id);
i++;
}
}
//java8
response.getNodes().stream()
.filter(node -> node.getId() != null)
.forEach(node -> node.setValue("This is the id: " + node.getId()));
Comment puis-je obtenir le nombre d'éléments filtrés qui ont été appliquées?
Sidequestion: dans l'ancien code, je peux réutiliser les Integer id
plusieurs fois. Comment puis-je obtenir le même avec des cours d'eau?
pourquoi ne pas ajouter à la variable externe en tant que contre et juste ajouter de l'opération d'incrémentation à la
Cela ne fonctionnerait pas avec une variable locale, car les variables capturées à partir de l'environnement que vous utilisez dans une lambda doit être effectivement final. Donc, il serait plus difficile que vous le pensez.
vous pouvez utiliser un
votre commentaire m'a fait prendre un regard plus profond sur Java 8 fonctions, j'ai passé trop de temps à l'extérieur
forEach
?Cela ne fonctionnerait pas avec une variable locale, car les variables capturées à partir de l'environnement que vous utilisez dans une lambda doit être effectivement final. Donc, il serait plus difficile que vous le pensez.
vous pouvez utiliser un
LongAdder
instance et de garder l'incrémentation. Cette catégorie a été ajoutée à Java 8 pour cet effet.votre commentaire m'a fait prendre un regard plus profond sur Java 8 fonctions, j'ai passé trop de temps à l'extérieur
Java
uni à la C# LINQ
ciel =)OriginalL'auteur membersound | 2015-03-25
Vous devez vous connecter pour publier un commentaire.
Depuis
setValue
est un effet secondaire de la fonction, vous pouvez utiliserpeek
:Je ne suis pas un fan de cette approche car le pic est censé utiliser pour le débogage but (ce qui ne devrait faire l'affaire). Notez que dans Java 9,
count()
peut être en mesure de ne pas exécuter le stream si il est possible de calculer le comte directement à partir de la source (je ne pense pas que c'est le cas ici, puisque vous appliquer un filtrage mais il est bon de garder cela à l'esprit).Cela dépend de votre cas d'utilisation, depuis l'API n'a pas de tuples votre meilleure chance est de créer une classe, disons
Tuple2
, de sorte que vous pouvez associer à chaque nœud d'un nouveau tuple et réutiliser le code.Quelque chose comme:
Dans votre cas, si vous restez avec un flux de nœuds, vous pouvez simplement saisir le code avec
getId()
à tout moment.Eh bien, si vous êtes conscient de ce que vous faites, ce n'est pas un problème. Vous ne pouvez pas toujours éviter les effets secondaires que Java n'est pas un langage fonctionnel de toute façon (même avec son tas de nouvelles fonctionnalités).
Vous pourriez sans doute diviser la tâche en deux divers flux d'opérations: La première définit l'id en utilisant forEach(), la seconde compte les nœuds à l'aide de la fonction count().
Oui c'est ce que je fais habituellement/recommander si vous avez besoin de 2 opérations de terminal (et que le rendement n'est pas un problème, ni quelque chose qui vous avez besoin pour optimiser pour le moment), mais dans ce cas,
forEach
est probablement le même quepeek
, il est donc très bien le faire en un seul passage.Vous avez raison. Mais forEach se sent plus correct pour moi d'une certaine façon - même si effectivement il n'y a pas de différence. Probablement, ils devraient renommer
peek
enforEachAndThen
juste pour se débarrasser de la mauvaise impression... 😉OriginalL'auteur Alexis C.