Contando correspondências em um filtro de fluxo
1. Visão geral
Neste tutorial, vamos explorar o uso do métodoStream.count(). Especificamente,we’ll see how we can combine the count() method with the filter() method to count the matches of a Predicate we foi aplicado.
2. UsandoStream.count()
O próprio métodocount() fornece uma funcionalidade pequena, mas muito útil. Também podemos combiná-lo de maneira excelente com outras ferramentas, por exemplo comStream.filter().
Vamos usar a mesma classeCustomer que definimos emour tutorial for Stream.filter():
public class Customer {
private String name;
private int points;
//Constructor and standard getters
}
Além disso, também criamos a mesma coleção de clientes:
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);
A seguir, aplicaremos os métodosStream na lista para filtrá-la e determinar quantas correspondências nossos filtros obtêm.
2.1. Elementos de Contagem
Vamos ver o uso básico decount():
long count = customers.stream().count();
assertThat(count).isEqualTo(4L);
Observe quecount() retorna um valorlong.
2.2. Usandocount() comfilter()
O exemplo na subseção anterior não foi realmente impressionante. Poderíamos ter chegado ao mesmo resultado com o métodoList.size().
Stream.count() realmente brilha quando o combinamos com outros métodosStream - na maioria das vezes comfilter():
long countBigCustomers = customers
.stream()
.filter(c -> c.getPoints() > 100)
.count();
assertThat(countBigCustomers).isEqualTo(2L);
Neste exemplo, aplicamos um filtro na lista de clientes e também obtivemos o número de clientes que atendem à condição. Nesse caso, temos dois clientes com mais de 100 pontos.
Obviamente, também pode acontecer que nenhum elemento corresponda ao nosso filtro:
long count = customers
.stream()
.filter(c -> c.getPoints() > 500)
.count();
assertThat(count).isEqualTo(0L);
2.3. Usandocount() com filtros avançados
Em nosso tutorial sobrefilter(), vimos alguns casos de uso mais avançados do método. Claro, ainda podemos contar o resultado de tais operaçõesfilter().
Podemos filtrar coleções com vários critérios:
long count = customers
.stream()
.filter(c -> c.getPoints() > 10 && c.getName().startsWith("Charles"))
.count();
assertThat(count).isEqualTo(1L);
Aqui, filtramos e contamos o número de clientes cujos nomes começam com "Charles" e que têm mais de 10 pontos.
Também podemos extrair os critérios em seu próprio método e usar a referência de método:
long count = customers
.stream()
.filter(Customer::hasOverHundredPoints)
.count();
assertThat(count).isEqualTo(2L);
3. Conclusão
Neste artigo, vimos alguns exemplos de como usar o métodocount() em combinação com o métodofilter() para processar fluxos. Para outros casos de uso decount(), verifique outros métodos que retornamStream, como aqueles mostrados emour tutorial about merging streams with concat().
Como sempre, o código completo está disponívelover on GitHub.