Java中如何在forEach中求和?如何统计代码末尾v的总和?
解决forEach求和与Java代码统计总和的问题
嘿,我来帮你搞定这两个需求!下面分场景说明,再把你的代码修改到位:
一、如何在forEach中实现求和?
在Java的Lambda表达式里直接用普通int变量累加会报错,因为Lambda要求外部变量是final或effectively final。有几种实用的解决方式:
- 方式1:使用原子类(AtomicInteger):原子类是线程安全的,适合在Lambda中修改值
- 方式2:用数组包装int:数组是引用类型,Lambda可以修改数组内部的元素值
- 方式3:结合Stream API直接计算总和:如果不需要在forEach过程中实时累加,直接用Stream的sum方法更简洁
二、修改你的Java代码,统计v的总和
针对你提供的代码,我用最简洁的方式修改,保留原有打印逻辑的同时,最后输出总和:
import java.io.BufferedReader; import java.io.FileReader; import java.util.Hashtable; import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception { System.out.print("Input word : "); BufferedReader br = new BufferedReader(new FileReader("d:\\input2.txt")); Scanner ob = new Scanner(System.in); String input = ob.next(); String str1 = ""; Hashtable<String, Integer> db = new Hashtable<>(); while ((str1 = br.readLine()) != null) { String[] line = str1.split(" "); String label = line[0]; for (int i = 1; i < line.length; i++) { if (line[i].equals(input)) { db.put(label, db.getOrDefault(label, 0) + 1); } } } // 先打印所有label和对应的数值 db.forEach((k, v) -> System.out.println(k + ", " + v)); // 计算并输出总和 int totalSum = db.values().stream() .mapToInt(Integer::intValue) .sum(); System.out.print("Sum : "); System.out.println(totalSum); } }
代码说明:
- 优化了原有的统计逻辑,用
db.getOrDefault一行代码完成计数更新,更简洁 - 保留
db.forEach打印所有键值对的逻辑 - 用
db.values().stream().mapToInt(Integer::intValue).sum()直接计算总和:db.values()获取所有统计数值的集合stream()转为流对象mapToInt把Integer类型转为int基本类型sum()直接计算总和
如果你非要在forEach过程中实时累加,可以用原子类的方式,修改如下:
import java.util.concurrent.atomic.AtomicInteger; // ... 其他代码保持不变 // 声明原子类用于累加 AtomicInteger sum = new AtomicInteger(0); // 在forEach中同时打印和累加 db.forEach((k, v) -> { System.out.println(k + ", " + v); sum.addAndGet(v); // 累加当前v的值 }); // 输出总和 System.out.print("Sum : "); System.out.println(sum.get());
这样运行后就会得到你期望的输出——输入指定单词后,打印每个label和对应数值,最后输出总和。
内容的提问来源于stack exchange,提问作者AbuDaHBeE
相关产品推荐
相关产品推荐

