← Назад к вопросам

Можно ли посчитать и получить количество элементов в Stream?

1.0 Junior🔥 221 комментариев
#Stream API и функциональное программирование#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Подсчет количества элементов в Stream

Да, можно посчитать и получить количество элементов в Stream, используя метод count(). Это терминальная операция, которая возвращает long значение.

Базовый пример

List<String> words = Arrays.asList("Java", "Stream", "API", "counting");
long count = words.stream().count();
System.out.println("Количество элементов: " + count); // 4

С фильтрацией

Очень часто нужно посчитать элементы, которые соответствуют определённому условию:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// Посчитать чётные числа
long evenCount = numbers.stream()
    .filter(n -> n % 2 == 0)
    .count();
System.out.println("Чётные числа: " + evenCount); // 5

Альтернатива через Collectors.counting()

Для более сложных сценариев можно использовать Collectors.counting():

List<String> fruits = Arrays.asList("Apple", "Banana", "Apple", "Orange", "Banana", "Apple");

// Подсчёт всех элементов
long total = fruits.stream()
    .collect(Collectors.counting());
System.out.println("Всего: " + total); // 6

// Подсчёт по группам
Map<String, Long> groupCount = fruits.stream()
    .collect(Collectors.groupingBy(
        Function.identity(),
        Collectors.counting()
    ));
System.out.println(groupCount);
// {Apple=3, Banana=2, Orange=1}

Важные особенности

  1. Stream одноразовый: после вызова count() Stream закрывается и повторно использовать его нельзя.
Stream<Integer> stream = numbers.stream();
long cnt = stream.count();
stream.count(); // IllegalStateException!
  1. Производительность: если Stream бесконечный, count() никогда не вернёт результат:
// Это зависнет!
Stream.iterate(0, n -> n + 1).count();
  1. Сравнение с Collection.size(): если у вас есть Collection, лучше использовать size() напрямую:
List<String> list = Arrays.asList("a", "b", "c");
int size = list.size(); // Предпочтительнее
long streamCount = list.stream().count(); // Медленнее

Практический пример

List<Employee> employees = ...; // Список сотрудников

// Подсчитать сотрудников с зарплатой больше 100000
long highEarners = employees.stream()
    .filter(emp -> emp.getSalary() > 100000)
    .count();

System.out.println("Сотрудников с зарплатой > 100000: " + highEarners);

Вывод: count() — это удобный и читаемый способ получить количество элементов в Stream. Для простого подсчёта используйте его, для более сложной группировки и статистики — Collectors.counting() и другие collectors.

Можно ли посчитать и получить количество элементов в Stream? | PrepBro