Conteggio delle corrispondenze su un filtro di flusso

1. Panoramica

In questo tutorial, esploreremo l'uso del metodo Stream.count () . Nello specifico, vedremo come possiamo combinare il metodo count () con il metodo filter () per contare le corrispondenze di un predicato che abbiamo applicato.

2. Utilizzo di Stream.count ()

Il metodo count () stesso fornisce una funzionalità piccola ma molto utile. Possiamo anche combinarlo in modo eccellente con altri strumenti, ad esempio con Stream.filter () .

Usiamo la stessa classe Customer che abbiamo definito nel nostro tutorial per Stream.filter () :

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

Inoltre, creiamo anche la stessa raccolta di clienti:

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);

Successivamente, applicheremo i metodi Stream all'elenco per filtrarlo e determinare quante corrispondenze ottengono i nostri filtri.

2.1. Conteggio degli elementi

Vediamo l'utilizzo di base di count () :

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

Notare che count () restituisce un valore lungo .

2.2. Utilizzo di count () Con filtro ()

L'esempio nella sottosezione precedente non era davvero impressionante. Saremmo potuti arrivare allo stesso risultato con il metodo List.size () .

Stream.count () brilla davvero quando lo combiniamo con altri metodi Stream , il più delle volte con filter () :

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

In questo esempio, abbiamo applicato un filtro all'elenco dei clienti e abbiamo anche ottenuto il numero di clienti che soddisfano la condizione. In questo caso, abbiamo due clienti con più di 100 punti.

Ovviamente può anche succedere che nessun elemento corrisponda al nostro filtro:

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

2.3. Utilizzo di count () con filtri avanzati

Nel nostro tutorial su filter () , abbiamo visto alcuni casi d'uso più avanzati del metodo. Naturalmente, possiamo ancora contare il risultato di tali operazioni filter () .

Possiamo filtrare le raccolte con più criteri:

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

Qui abbiamo filtrato e contato il numero di clienti i cui nomi iniziano con "Charles" e che hanno più di 10 punti.

Possiamo anche estrarre i criteri nel proprio metodo e utilizzare il metodo di riferimento:

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

3. Conclusione

In questo articolo, abbiamo visto alcuni esempi di come utilizzare il metodo count () in combinazione con il metodo filter () per elaborare i flussi. Per ulteriori casi d'uso di count () , controlla altri metodi che restituiscono un flusso , come quelli mostrati nel nostro tutorial sull'unione di flussi con concat () .

Come sempre, il codice completo è disponibile su GitHub.