Contando correspondências em um filtro de fluxo

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.