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