กองการ์ดสีแยกกลุ่มบนโต๊ะมิ้นต์มีตัวนับสีอำพันบนแต่ละกอง

Java Collectors.groupingBy + counting: นับรายการตามกลุ่มในพาสเดียว

น้องกายEngineering

เวลาผมมีโลกรีเควสต์แล้วอยากรู้ว่าแต่ละสถานะมีกี่อัน การวน map เองก็ได้ แต่สตรีมสั้นกว่าครับ

Collectors.groupingBy จัดกลุ่มตามคีย์ และส่ง downstream เป็น counting() เพื่อนับจำนวนในแต่ละกลุ่ม

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

public class Main {
    public static void main(String[] args) {
        List<String> statuses = List.of("ok", "error", "ok", "retry", "ok", "error");
        Map<String, Long> counts = statuses.stream()
                .collect(Collectors.groupingBy(s -> s, Collectors.counting()));
        assert counts.get("ok") == 3L;
        assert counts.get("error") == 2L;
        assert counts.get("retry") == 1L;
        System.out.println("groupingBy counting tests passed");
    }
}

ถ้าคีย์เป็น null จะได้กลุ่ม null — กรองก่อนถ้าไม่ต้องการ และระวังสตรีมขนานที่ต้องใช้ groupingByConcurrent

Recap

  • อ่าน groupingBy + counting
  • ใช้กับรายงานสถานะ / tag frequency
  • กรอง null ก่อนถ้าธุรกิจไม่รับ
  • สตรีมขนาน → พิจารณา groupingByConcurrent