说到 Java 中 Lambda 表达式如何用于集合元素计算,核心思路其实很简单:Lambda 本身并不直接执行计算,必须配合 Stream API 才能发挥威力。先将集合转为流(stream()),再通过一条函数式操作链,即可轻松完成求和、平均值、最大值最小值、分组汇总等常见操作。

下面几个高频场景,几乎覆盖了日常开发中绝大多数的数值计算需求。
基础求和:整数列表或对象属性求和
无论是针对 List 还是对象中的某个数值字段,最常用的方式就是借助 mapToInt().sum():
list.stream().mapToInt(Integer::intValue).sum()—— 直接计算整数列表的总和users.stream().mapToInt(User::getScore).sum()—— 对 User 对象的 score 字段进行求和- 注意:
mapToInt返回的是IntStream,才能调用sum();如果误用了map,返回的是Stream,则无法直接使用 sum 方法
多类型聚合:平均值、最值、计数
这些操作均基于对应的原始类型流(IntStream / LongStream / DoubleStream),使用模式非常一致:
- 平均值:
list.stream().mapToInt(x -> x).average().orElse(0.0)(返回 OptionalDouble,需处理空值情况) - 最大值:
list.stream().mapToInt(x -> x).max().orElse(-1) - 最小值:
list.stream().mapToInt(x -> x).min().orElse(-1) - 元素个数:
list.stream().count()(此方法无需 map,直接统计总数)
分组后聚合:按字段分类再计算总和或均值
先通过 groupingBy 进行分组,再嵌套聚合操作,最终得到一个 Map:
- 按姓名分组并求每组分数总和:
users.stream().collect(Collectors.groupingBy(User::getName, Collectors.summingInt(User::getScore))) - 按年龄分组并求每组平均分:
users.stream().collect(Collectors.groupingBy(User::getAge, Collectors.averagingInt(User::getScore))) - 结果类型分别为
Map或Map,使用起来非常直观
灵活归约:自定义计算逻辑
当内置方法无法满足需求时,reduce 就是通用的解决方案:
- 简单累加:
list.stream().reduce(0, (a, b) -> a + b)或简写为list.stream().reduce(0, Integer::sum) - 空集合安全处理:
reduce返回Optional,因此推荐使用带初始值的三参数版本,避免判空繁琐 - 对象字段归约:
users.stream().reduce(0, (sum, u) -> sum + u.getScore(), Integer::sum)
实践证明,这些方法组合应用,足以应对绝大部分集合数值计算场景。写代码时心中有数,使用起来自然得心应手。
