在Java中,对数组进行数字计算是常见操作,涵盖求和、平均值、极值、排序等场景,以下是详细实现方法和最佳实践,代码均基于Java 8+语法:
基础数字计算
数组求和
int[] numbers = {3, 7, 2, 9, 5}; // 方法1:循环累加 int sum = 0; for (int num : numbers) { sum += num; } // 方法2:Stream API(推荐) int sum = Arrays.stream(numbers).sum();
计算平均值
double average = Arrays.stream(numbers).average().orElse(0); // 输出:5.2(保留两位小数:String.format("%.2f", average))
查找最大值/最小值
int max = Arrays.stream(numbers).max().getAsInt(); int min = Arrays.stream(numbers).min().getAsInt();
进阶数值操作
排序数组
Arrays.sort(numbers); // 升序排序 // 降序排序(需转换为Integer对象流) Integer[] nums = {3, 7, 2, 9, 5}; Arrays.sort(nums, Collections.reverseOrder());
条件筛选计算
// 计算正数之和 int positiveSum = Arrays.stream(numbers) .filter(n -> n > 0) .sum(); // 统计大于平均值的元素数量 long countAboveAvg = Arrays.stream(numbers) .filter(n -> n > average) .count();
多维数组计算
int[][] matrix = {{1, 2}, {3, 4}, {5, 6}}; // 计算所有元素总和 int total = Arrays.stream(matrix) .flatMapToInt(Arrays::stream) .sum(); // 结果:21 // 计算每行平均值 double[] rowAverages = Arrays.stream(matrix) .mapToDouble(row -> Arrays.stream(row).average().orElse(0)) .toArray(); // [1.5, 3.5, 5.5]
特殊场景处理
大数组优化(避免装箱)
// 使用基本类型流(避免Integer装箱开销) long largeSum = Arrays.stream(new int[1000000]).parallel().sum();
空数组安全处理
double safeAvg = Arrays.stream(numbers) .average() .orElse(Double.NaN); // 返回NaN而非异常
自定义对象数组计算
class Product { String name; double price; // 构造方法/getter省略 } Product[] products = {new Product("A", 25.5), new Product("B", 40.2)}; // 计算总价格 double totalPrice = Arrays.stream(products) .mapToDouble(Product::getPrice) .sum();
性能与最佳实践
-
循环 vs Stream API
- 小型数组:传统循环效率更高
- 复杂操作/大型数组:Stream API可读性和并行优势明显
-
并行计算优化
int sum = Arrays.stream(numbers).parallel().sum(); // 超10万元素时加速
-
精度处理建议
- 金融计算用
BigDecimal
- 科学计算用
double
但注意浮点误差
- 金融计算用
常见问题解答
Q:为什么用orElse()
处理Optional结果?
A:防止空数组调用getAsDouble()
抛出NoSuchElementException
。
Q:如何保留小数位?
A:使用格式化输出:
double avg = 5.2; System.out.printf("平均值: %.2f", avg); // 输出:平均值: 5.20
Q:对象数组如何排序?
A:实现Comparable
接口或使用Comparator:
Arrays.sort(products, Comparator.comparingDouble(Product::getPrice));
引用说明
本文代码基于Oracle官方Java 17 API文档验证,遵循Java语言规范(JLS),并行流实现参考Brian Goetz《Java并发编程实战》,数值精度处理建议遵循IEEE 754标准。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/19718.html