You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

代码说明:

  1. 优化了原有的统计逻辑,用db.getOrDefault一行代码完成计数更新,更简洁
  2. 保留db.forEach打印所有键值对的逻辑
  3. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:07:35