【问题标题】:How to sum HashMap values in lambda expression? [duplicate]如何在 lambda 表达式中对 HashMap 值求和? [复制]
【发布时间】:2017-11-05 14:29:28
【问题描述】:

我想对作为 Hashmap 值的双变量列表求和。但我想用 lambda 表达式而不是 entrySet 或其他东西来做。

HashMap <Integer,Double> h=new HashMap<Integer,Double>();//I've put some key,value pairs in it 

double sum =0.0;
h.forEach((k,v)->{
    sum+=v;
});
System.out.println(sum);

但它说; 在封闭范围内定义的局部变量 sum 必须是 final 或有效 final。 我该如何解决这个问题?

【问题讨论】:

    标签: java lambda java-8 hashmap


    【解决方案1】:

    好吧,正如编译器告诉你的那样,你不能在 lambda 表达式中修改局部变量。

    除了使用forEach,您可以创建Stream&lt;Double&gt;Map 的值并将Stream 的元素相加:

    double sum = h.values()
                  .stream()
                  .mapToDouble(Double::doubleValue)
                  .sum();
    

    【讨论】:

    • 谢谢,我知道这个解决方案,但我只是想很好地获得 lambda 表达式。例如,这段代码可以正常工作,但我也没有得到它 double sum[] ={0}; h2.forEach((k,v)->{ sum[0]+=v; }); System.out.println(sum[0]);
    • @HaticeYazıcı 使用数组来克服这个限制通常是一种不好的做法。代码使用数组变量的原因是分配给sum[0] 不会更改sum 的值(这是对数组对象的引用)。
    • 谢谢,我搞定了。最后哪一个更有效,为什么;用 entrySet 或 Stream 解决它?
    • @HaticeYazıcı 使用 Streams 会增加一些开销,所以我假设它与遍历 Map 的某些循环相比会更慢。差异是否显着,我不知道。
    猜你喜欢
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2010-09-29
    • 2015-05-26
    • 2014-03-07
    • 1970-01-01
    • 2013-01-31
    • 2022-01-23
    相关资源
    最近更新 更多