您的位置:首页 >Java流处理结果收集技巧
发布于2026-01-30 阅读(0)
扫一扫,手机访问
Collectors.toList()返回ArrayList,保留顺序且允许重复;toSet()返回HashSet,不保证顺序且自动去重;groupingBy遇null元素或null键会抛NPE;averagingDouble存在浮点精度误差且空流需判Optional。

调用 Collectors.toList() 得到的是 ArrayList 实例,顺序保留、允许重复;而 Collectors.toSet() 返回的是 HashSet(JDK 11+ 默认),不保证顺序且自动去重。如果原始流含重复元素或对顺序敏感,选错会导致逻辑错误。
toList()toSet() 足够Collectors.toCollection(TreeSet::new)当流中存在 null 元素,且分组函数返回 null(例如对对象字段直接调用 obj.getName()),groupingBy() 会抛出 NullPointerException。它默认使用 HashMap 作底层容器,不支持 null 键。
null 元素,如 .filter(Objects::nonNull)groupingBy(obj -> obj != null ? obj.getType() : "UNKNOWN")null 键,得手动构造 ConcurrentHashMap 并传入下游收集器,但非常规场景averagingDouble、summingInt 这类方法返回的是基本类型包装结果(如 Double),但它们内部用的是简单累加,**不处理浮点误差累积**,也不做高精度补偿。对大量小数求平均时,结果可能与手算或 BigDecimal 方式有微小偏差。
averagingDouble,改用 Collectors.collectingAndThen(..., BigDecimal::doubleValue) 配合自定义归约OptionalDouble,空流会返回 OptionalDouble.empty(),直接 getAsDouble() 会抛异常Double avg = list.stream()
.mapToDouble(Item::getPrice)
.average()
.orElse(0.0); // 必须处理 empty 情况
写匿名 Collector.of() 或实现 Collector 接口,看似灵活,但容易忽略三个代价点:并发场景下 combiner 被频繁调用;finisher 若做深拷贝或格式化,会放大 GC 压力;中间容器(如 ArrayList)若未预估大小,反复扩容影响吞吐。
toCollection(ArrayList::new) + 后续处理Collectors.toMap() 内置实现更稳supplier 中的容器初始化加上初始容量,比如 () -> new ArrayList<>(list.size())groupingBy 遇到 null 直接崩,以及 averagingDouble 在空流时没判 Optional 就取值——这两处线上报错频率远高于 Collector 写法本身。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9