Рубрики
Без рубрики

Подсчет совпадений на фильтре потока

Узнайте, как фильтровать поток и считать совпадения

Автор оригинала: baeldung.

1. Обзор

В этом учебнике мы изумим использование Stream.count () метод. В частности, Посмотрим, как мы сможем совместить рассчитывать () метод с фильтр () метод подсчета совпадений Предикат мы подали заявку.

2. Использование Stream.count()

рассчитывать () сам метод обеспечивает небольшую, но очень полезную функциональность. Мы также можем прекрасно сочетать его с другими инструментами, например, с Stream.filter () .

Давайте использовать тот же Клиентская класс, который мы определили в наш учебник для Stream.filter () :

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

Кроме того, мы также создаем такую же коллекцию клиентов:

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

Далее, мы будем применять Поток методы в списке, чтобы отфильтровать его и определить, сколько соответствует нашим фильтрам получить.

2.1. Подсчет элементов

Давайте посмотрим, очень простое использование рассчитывать () :

long count = customers.stream().count();

assertThat(count).isEqualTo(4L);

Обратите внимание, что рассчитывать () возвращает долго ценность.

2.2. Использование счета () с фильтром ()

Пример в предыдущем подразделе не был действительно впечатляющим. Мы могли бы прийти к тому же результату с List.size () метод.

Stream.count () действительно светит, когда мы объединяем его с другими поток методы – чаще всего с фильтр () :

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

assertThat(countBigCustomers).isEqualTo(2L);

В этом примере мы применили фильтр в списке клиентов, а также получили количество клиентов, которые выполняют условия. В этом случае у нас есть два клиента с более чем 100 точками.

Конечно, может случиться и так, что ни один элемент не соответствует нашему фильтру:

long count = customers
  .stream()
  .filter(c -> c.getPoints() > 500)
  .count();

assertThat(count).isEqualTo(0L);

2.3. Использование графа () с расширенными фильтрами

В нашем учебнике о фильтр () , мы видели некоторые более продвинутые случаи использования метода. Конечно, мы все еще можем рассчитывать на результат такого фильтр () операционный.

Мы можем фильтровать коллекции с несколькими критериями:

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

assertThat(count).isEqualTo(1L);

Здесь мы отфильтровыли и подсчитали количество клиентов, имена которых начинаются с “Чарльза” и которые имеют более 10 баллов.

Мы также можем извлечь критерии в свой собственный метод и использовать ссылку на метод:

long count = customers
  .stream()
  .filter(Customer::hasOverHundredPoints)
  .count();

assertThat(count).isEqualTo(2L);

3. Заключение

В этой статье мы видели несколько примеров того, как использовать рассчитывать () метод в сочетании с фильтр () метод обработки потоков. Для дальнейшего использования случаев рассчитывать () , проверить другие методы, которые возвращают Поток , такие, как те, которые показаны в наш учебник о слиянии потоков с concat () .

Как всегда, полный код доступен более на GitHub .