跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何在Java中计算数组元素的平均值_Java数值处理实战

Arrays.stream() 计算平均值最简洁但需注意空数组返回 OptionalDouble.empty(),整型数组须 mapToDouble,浮点数组可直接 average(),大数组或极端值建议手写循环防溢出,null 或非数值元素需先过滤清洗。 用
Arrays.stream()
算平均值最省事,但要注意空数组 Java 8+ 之后,
Arrays.stream()
配合
average()
是最直接的写法,返回
OptionalDouble
—— 这不是偷懒设计,而是明确告诉你:空数组没有平均值。 空数组会触发
OptionalDouble.empty()
,直接调
getAsDouble()
抛
NoSuchElementException
整型数组(
int[]
)走
Arrays.stream(arr).mapToDouble(i -> i)
,别漏了
mapToDouble
,否则
average()
不可用 浮点数组(
double[]
)可直接用
Arrays.stream(arr).average()
int[] nums = {1, 2, 3, 4, 5}; double avg = Arrays.stream(nums).mapToDouble(i -> i).average().orElse(0.0); // 建议显式 fallback
for
循环手动累加更可控,适合有精度或溢出顾虑的场景 流式 API 看似简洁,但对大数组或极端值(如
Integer.MAX_VALUE
连续相加)可能悄悄溢出,且无法中途干预。手写循环虽然多几行,但每一步都自己盯着。 用
long
累加
int[]
,避免整数溢出;用
double
累加
float[]
,减少舍入误差 空数组必须提前判空,否则除零异常:
ArithmeticException: / by zero
如果数组元素含
NaN
或无穷大,
Double.NaN
会污染整个结果(任何数 + NaN = NaN)
int[] arr = {1000000000, 1000000000, 1000000000}; long sum = 0; for (int x : arr) sum += (long) x; double avg = arr.length > 0 ? (double) sum / arr.length : 0.0;
处理
null
或非数值元素?得先清洗数据 Java 数组本身不存
null
(基本类型)或混合类型(引用类型数组如
Number[]
才可能),但实际业务中常遇到
Number[]
或
Object[]
,里面混着
null
、
String
甚至
BigDecimal
。 Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载
Arrays.stream(numbers).mapToDouble(Number::doubleValue).average()
遇到
null
直接抛
NullPointerException
必须先过滤:
Arrays.stream(numbers).filter(Objects::nonNull).mapToDouble(Number::doubleValue)
若含
String
,不能靠自动转换,得显式解析:
s -> Double.parseDouble(s)
,并捕获
NumberFormatException
性能差异不大,但别在循环里反复调
stream()
单次计算,
stream()
和
for
差距几乎感知不到;但若在高频方法里(比如每毫秒调一次),反复创建流对象会有微小开销,且 GC 压力略高。 立即学习 “ Java免费学习笔记(深入) ”; 不要写成:
for (int i = 0; i
大数据量(百万级)且对延迟敏感时,优先选
for
循环 注意
DoubleStream.average()
内部仍是两趟遍历(先求和再除长度),并非优化成单趟 空数组、
null
元素、整数溢出、类型混杂——这些不是边缘情况,是线上日志里真实报错的前几名。别等
OptionalDouble.empty().getAsDouble()
崩给你看。

相关文章