Collectors.counting în Java

Numără elementele; folosit mai ales în groupingBy, pentru „câte elemente are fiecare grup”.

Sintaxă
static <T> Collector<T, ?, Long> counting()

Ce face Collectors.counting

Collectors.counting() numără elementele și dă un Long. Singur, collect(Collectors.counting()) face același lucru ca count(), care este mai scurt.

Locul lui adevărat este ca downstream în groupingBy sau partitioningBy: groupingBy(Student::oras, Collectors.counting()) dă câți studenți are fiecare oraș. Rezultatul este un map cu valori Long, nu Integer.

Ce returnează

Un Collector care produce numărul de elemente, de tip Long.

Exemple

Exemplul 1: Câte cuvinte de fiecare fel

Numărăm de câte ori apare fiecare cuvânt dintr-o propoziție. TreeMap::new sortează cuvintele.

import java.util.Arrays;
import java.util.Map;
import java.util.TreeMap;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String text = "ana are mere ana are pere ana are prune";
        Map<String, Long> frecventa = Arrays.stream(text.split(" "))
                .collect(Collectors.groupingBy(Function.identity(), TreeMap::new, Collectors.counting()));
        System.out.println(frecventa);
    }
}

Rezultat

{ana=3, are=3, mere=1, pere=1, prune=1}

Exemplul 2: counting singur și în partitioningBy

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Integer> note = List.of(9, 4, 7, 10, 3, 8);

        long toate = note.stream().collect(Collectors.counting());
        System.out.println("Note: " + toate);

        Map<Boolean, Long> trecuti = note.stream()
                .collect(Collectors.partitioningBy(n -> n >= 5, Collectors.counting()));
        System.out.println("Promovați: " + trecuti.get(true) + ", nepromovați: " + trecuti.get(false));
    }
}

Rezultat

Note: 6
Promovați: 4, nepromovați: 2

Greșeli frecvente

  • Declari rezultatul ca Map<String, Integer>. counting() dă Long; scrie Map<String, Long>.
  • Folosești collect(Collectors.counting()) fără grupare. count() e mai simplu și mai rapid.

Comenzi înrudite

  • Collectors.groupingBy: Împarte elementele în grupuri după o cheie (oraș, grupă, prima literă) și dă un Map cheie → listă sau cheie → rezultat.
  • Stream.count: Returnează numărul de elemente din stream, de tip long.
  • Collectors.summingInt: Adună un câmp numeric al elementelor (summingInt) sau îi calculează media (averagingDouble), de obicei pe grupuri.
  • Collectors.partitioningBy: Împarte elementele în două grupuri, după o condiție: cele care o îndeplinesc (true) și celelalte (false).