跳转到主内容
极星编程网:以代码为星,赴技术山海!

怎么利用Collectors.summarizingInt一次性获取最大最小平均等统计量

Collectors.summarizingInt 返回 IntSummaryStatistics 对象而非原始 int,需先保存为变量再调用 getMax()、getAverage() 等方法,直接链式调用 .max() 会编译失败。 summarizingInt 返回的是 IntSummaryStatistics,不是数字 很多人调用
Collectors.summarizingInt
后直接想用
.getMax()
却报错,其实是没意识到它返回的是一个封装对象,不是原始 int。这个对象里才存着你真正要的统计值。 常见错误现象:
stream.collect(Collectors.summarizingInt(x -> x))
写完就试图在后面链式调用
.max()
或
.average()
—— 编译不通过,因为
IntSummaryStatistics
没有这些方法名(正确是
getMax()
、
getAverage()
)。 必须先保存结果到变量,再调用
getMin()
/
getMax()
/
getAverage()
/
getSum()
/
  • getAverage()
  • 返回
    double
    ,注意空流时返回
    0.0
    (不是
    NaN
    ),这点和
    OptionalDouble
    不同 如果流为空,
    getMin()
    和
    getMax()
    会返回
    Integer.MAX_VALUE
    和
    Integer.MIN_VALUE
    —— 这是设计行为,不是 bug,但容易误判 空流时的极值要单独判断,不能直接信 getMin/getMax 比如对空
    List
    调用
    summarizingInt
    ,得到的
    IntSummaryStatistics
    的
    getMin()
    是
    2147483647
    ,
    getMax()
    是
    -2147483648
    。这显然不是业务想表达的“无数据”。 正确做法是先检查
    getCount() == 0
    ,再决定是否取极值:
    IntSummaryStatistics stats = list.stream() .collect(Collectors.summarizingInt(Integer::intValue)); if (stats.getCount() == 0) { // 处理空情况:抛异常、返回 Optional.empty()、或设默认值 } else { int min = stats.getMin(); int max = stats.getMax(); double avg = stats.getAverage(); }
    summarizingInt 只支持 int,别和 summarizingLong/Double 混用 类型不匹配会导致编译失败或隐式截断。比如对
    long
    值强行用
    summarizingInt
    ,会触发
    long → int
    强制转换,可能溢出。 输入是
    long
    或
    Long
    ?用
    Collectors.summarizingLong(Long::longValue)
    输入是
    double
    或
    Double
    ?用
    Collectors.summarizingDouble(Double::doubleValue)
    没有泛型推导魔法——函数参数类型必须和收集器类型一致,否则编译不过 性能上三者无差别,选错只是逻辑错误,不是慢的问题 替代方案:需要部分统计量时,summarizingInt 可能过度 如果只要平均值和总数,用
    Collectors.averagingInt
    +
    Collectors.counting()
    并行收集反而更清晰;如果还要做分组统计,
    summarizingInt
    配合
    groupingBy
    是好选择,但要注意嵌套后类型变深。 单次遍历确实省事,但可读性未必高——尤其当后续只用其中一两个字段时 如果统计逻辑后续要扩展(比如加标准差),
    IntSummaryStatistics
    不提供,得自己算或换库 它不支持自定义精度控制(比如平均值保留两位小数),得靠外部格式化 真正容易被忽略的是空流时的极值语义——它不是“未定义”,而是有确定但反直觉的返回值,业务代码里漏掉
    getCount()
    判断,上线后可能在边缘 case 里悄悄出错。

    相关文章