Comptage des correspondances sur un filtre de flux

1. Vue d'ensemble

Dans ce didacticiel, nous allons explorer l'utilisation de la méthode Stream.count () . Plus précisément, nous verrons comment nous pouvons combiner la méthode count () avec la méthode filter () pour compter les correspondances d'un prédicat que nous avons appliqué.

2. Utilisation de Stream.count ()

La méthode count () elle-même fournit une fonctionnalité petite mais très utile. Nous pouvons également le combiner parfaitement avec d'autres outils, par exemple avec Stream.filter () .

Utilisons la même classe Customer que nous avons définie dans notre tutoriel pour Stream.filter () :

public class Customer { private String name; private int points; //Constructor and standard getters }

De plus, nous créons également la même collection de clients:

Customer john = new Customer("John P.", 15); Customer sarah = new Customer("Sarah M.", 200); Customer charles = new Customer("Charles B.", 150); Customer mary = new Customer("Mary T.", 1); List customers = Arrays.asList(john, sarah, charles, mary);

Ensuite, nous appliquerons les méthodes Stream sur la liste pour la filtrer et déterminer le nombre de correspondances que nos filtres obtiennent.

2.1. Comptage des éléments

Voyons l'utilisation très basique de count () :

long count = customers.stream().count(); assertThat(count).isEqualTo(4L);

Notez que count () renvoie une valeur longue .

2.2. Utilisation de count () Avec filtre ()

L'exemple de la sous-section précédente n'était pas vraiment impressionnant. Nous aurions pu arriver au même résultat avec la méthode List.size () .

Stream.count () brille vraiment lorsque nous le combinons avec d'autres méthodes Stream - le plus souvent avec filter () :

long countBigCustomers = customers .stream() .filter(c -> c.getPoints() > 100) .count(); assertThat(countBigCustomers).isEqualTo(2L);

Dans cet exemple, nous avons appliqué un filtre sur la liste des clients, et nous avons également obtenu le nombre de clients qui remplissent la condition. Dans ce cas, nous avons deux clients avec plus de 100 points.

Bien sûr, il peut aussi arriver qu'aucun élément ne corresponde à notre filtre:

long count = customers .stream() .filter(c -> c.getPoints() > 500) .count(); assertThat(count).isEqualTo(0L); 

2.3. Utilisation de count () avec des filtres avancés

Dans notre tutoriel sur filter () , nous avons vu des cas d'utilisation plus avancés de la méthode. Bien sûr, nous pouvons toujours compter le résultat de ces opérations filter () .

Nous pouvons filtrer les collections avec plusieurs critères:

long count = customers .stream() .filter(c -> c.getPoints() > 10 && c.getName().startsWith("Charles")) .count(); assertThat(count).isEqualTo(1L);

Ici, nous avons filtré et compté le nombre de clients dont les noms commencent par «Charles» et qui ont plus de 10 points.

Nous pouvons également extraire les critères dans sa propre méthode et utiliser la référence de méthode:

long count = customers .stream() .filter(Customer::hasOverHundredPoints) .count(); assertThat(count).isEqualTo(2L);

3. Conclusion

Dans cet article, nous avons vu quelques exemples d'utilisation de la méthode count () en combinaison avec la méthode filter () pour traiter les flux. Pour d'autres cas d'utilisation de count () , consultez d'autres méthodes qui retournent un Stream , telles que celles présentées dans notre tutoriel sur la fusion de flux avec concat () .

Comme toujours, le code complet est disponible à l'adresse over sur GitHub.