Java 获取映射中的值之和

Java 获取映射中的值之和,java,java-stream,Java,Java Stream,在对每个值应用操作后,我必须得到映射中的值的总和 我是这样做的: Map<Employee, Integer> employeeBudget = committedHoursPerDay.entrySet() .stream() .collect(Collectors.toMap(Map.Entry::getKey, o -> o.getKey().getHourlyWage() * o.getValue()));

在对每个值应用操作后,我必须得到映射中的值的总和

我是这样做的:

   Map<Employee, Integer> employeeBudget = committedHoursPerDay.entrySet()
            .stream()
            .collect(Collectors.toMap(Map.Entry::getKey, o -> o.getKey().getHourlyWage() * o.getValue()));

    //Get the total cost for all the employee
    int manpowerBudget = employeeBudget.values()
            .stream()
            .mapToInt(Integer::intValue)
            .sum();
Map employeeBudget=committedHoursPerDay.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,o->o.getKey().getHourlyWage()*o.getValue());
//获取所有员工的总成本
int-manpowerBudget=employeeBudget.values()
.stream()
.mapToInt(整数::intValue)
.sum();

这个解决方案有效。我认为有更好的方法来解决这个问题,但我想不出来。

事实上,我认为您可以只使用一个流:

int manpowerBudget = committedHoursPerDay.entrySet().stream()
                .mapToInt(kv-> kv.getKey().getHourlyWage() * kv.getValue())
                .sum();


我认为您不需要将其收集到
映射中
,只需对值求和即可。像这样的方法应该会奏效:

int manpowerBudget = committedHoursPerDay.entrySet()
        .stream()
        .mapToInt(o -> o.getKey().getHourlyWage() * o.getValue()) // or mapToDouble if you want double instead of int
        .sum();

现有答案假设您不需要首先创建
映射。在您这样做的情况下,可能是因为您将在其他地方使用它,以下是一些替代方案:

int manpowerBudget = employeeBudget .values().stream().reduce(0, Integer::sum);
更新:如果性能很重要,我建议您在@D.Lawrence的回答中加入上述内容。没有必要绘制地图

另一个选择是:

int manpowerBudget = map.values().stream().collect(Collectors.summingInt(Integer::intValue));

但是你还是用原来的方法代替第二种方法吧。

在我看来已经很优雅了。在此之后,您是否重复使用
employeeBudget
?如果没有,您可以从
committeedhoursperday
直接向下流到sum.will
int-manpowerBudget=committeedhoursperday.entrySet().stream().mapToInt(o->o.getKey().getHourlyWage()*o.getValue()).sum()为你工作?