java stream api 对数值集合求和与平均值,核心在于使用 maptodouble() 将元素映射为 doublestream,再调用 sum() 或 average()。对于整数集合,需先通过 maptodouble() 转换,避免 collect() 中累加器的类型推断问题。此方法能自动处理空值(返回0或optionaldouble),并支持并行流优化。

如何对 Integer 集合进行求和计算
对 Integer 集合求和时,直接使用 reduce() 可能因初始值类型不匹配导致编译错误,推荐先用 mapToDouble() 转为双精度流。具体做法是调用 stream().mapToDouble(Integer::doubleValue).sum(),这会返回一个 double 类型的总和。若集合为空,sum() 会返回 0.0,不会抛出异常。这种方式比 collect(Collectors.summingInt()) 更直观,且避免了装箱拆箱的性能损耗。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
double sum = numbers.stream()
.mapToDouble(Integer::doubleValue)
.sum();
System.out.println(sum); // 输出: 15.0
如何安全地获取平均值并处理空集
获取平均值时,必须使用 average() 方法,因为它返回 OptionalDouble,能安全处理空集合。直接调用 sum() / count() 会在集合为空时除以零引发异常。正确做法是链式调用 stream().mapToDouble(...).average().orElse(0.0),这样在空集时返回默认值 0.0。若需保留 Optional 语义以便后续判断,可不调用 orElse,直接检查 isPresent()。这种方法适用于任何数值类型,只需调整映射函数即可。
立即学习“Java免费学习笔记(深入)”;

OptionalDouble avg = numbers.stream()
.mapToDouble(Integer::doubleValue)
.average();
if (avg.isPresent()) {
System.out.println(avg.getAsDouble());
} else {
System.out.println("No average available");
}
当输入集合包含 null 值时会发生什么
当输入集合包含 null 值时,mapToDouble() 会抛出 NullPointerException,因为映射函数无法处理 null。解决方法是在映射前过滤掉 null 值,即使用 filter(Objects::nonNull)。例如:numbers.stream().filter(Objects::nonNull).mapToDouble(...)。这样能确保流中只有有效数值,避免运行时异常。若需统计 null 值数量,可单独计数,但求和与平均值计算应排除 null。


















