groupingBy does not accept a null value from its classifier; define an explicit bucket before collecting nullable records.
Java Collectors.groupingBy: reject or normalize null classifier keys
Make missing classification visible
A warehouse record without a region is not automatically part of a null-key group. The standard groupingBy collector rejects a null classifier result. Treat the missing field as invalid input, or map it to a named bucket with a clear reporting meaning.
The program uses UNASSIGNED for a known reporting bucket. That is a business choice, not a library default. If the bucket could collide with a real region code, use a typed key instead of a string sentinel. Optional can model absence before a boundary chooses its representation.
Keep grouping costs explicit
Grouping stores references to the original records in lists. Mutating those records later changes what a reader sees through the groups; copy immutable values when the report must be a snapshot. The resulting map also has no promised iteration order.
Working program
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class WarehouseRegionBuckets {
static final class Dispatch {
final String id;
final String region;
Dispatch(String id, String region) {
this.id = id;
this.region = region;
}
}
public static void main(String[] args) {
List<Dispatch> dispatches = Arrays.asList(
new Dispatch("DSP-47", "WEST"),
new Dispatch("DSP-82", null),
new Dispatch("DSP-91", "WEST"));
Map<String, List<Dispatch>> byRegion = dispatches.stream().collect(
Collectors.groupingBy(dispatch ->
dispatch.region == null ? "UNASSIGNED" : dispatch.region));
System.out.println("WEST=" + byRegion.get("WEST").size());
System.out.println("UNASSIGNED=" + byRegion.get("UNASSIGNED").get(0).id);
}
}Output
WEST=2
UNASSIGNED=DSP-82Cost and ownership
Expected grouping time is O(n) and storage is O(n) references plus map and list overhead. The collector keeps group lists in memory; for a very large input, aggregate counts with a downstream collector or process bounded batches.
Common Mistakes
- Do not assume groupingBy creates a null-key bucket.
- Do not use a sentinel that can also be a valid region.
- Do not expect map iteration order or immutable group snapshots by default.
Read next
Java Collectors.toMap: choose a duplicate-key rule, collectors tomap order, Java Optional: absence without hidden failure, Java streams: lazy pipelines and bounded results.
