Java8流-每个映射键的数字总和列表

Java8流-每个映射键的数字总和列表,java,java-8,java-stream,reduce,Java,Java 8,Java Stream,Reduce,是否有一种简单/优雅的方法可以对地图中每个键的列表中的数字求和,例如从map我想得到map?我找不到/弄不明白…要从Map更改为Map,有两个步骤: map.entrySet() .stream() .collect(Collectors.toMap( Entry::getKey, x -> x.getValue().stream()

是否有一种简单/优雅的方法可以对地图中每个键的列表中的数字求和,例如从
map
我想得到
map
?我找不到/弄不明白…

要从
Map
更改为
Map
,有两个步骤:

map.entrySet()
            .stream()
            .collect(Collectors.toMap(
                    Entry::getKey,
                    x -> x.getValue().stream()
                                     .reduce(BigDecimal::add)
                                     .orElse(BigDecimal.ZERO)));
第一步:使用
Collectors.toMap
将旧地图的键转移到新地图

第二步:您必须对
列表中的所有元素求和
有许多方法,其中之一是使用
e.getValue().stream().reduce(BigDecimal.ZERO,BigDecimal::add)

最后,您的代码可以如下所示:

Map<String, BigDecimal> result = map.entrySet().stream()
        .collect(Collectors.toMap(
                Map.Entry::getKey, 
                e -> e.getValue().stream().reduce(BigDecimal.ZERO, BigDecimal::add))
        );
Map result=Map.entrySet().stream()
.collect(collector.toMap)(
Map.Entry::getKey,
e->e.getValue().stream().reduce(BigDecimal.ZERO,BigDecimal::add))
);


您想使用
.reduce(BigDecimal::add).orElse(BigDecimal.ZERO)
执行此操作,很可能。。。我们都投了反对票:)nice@Eugene
reduce(BigDecimal.ZERO,BigDecimal::add)
reduce(BigDecimal::add)。orElse(BigDecimal.ZERO)
给出相同的结果(如果流为空,则求和或零)。@Slaw当然是这样,这不是问题所在point@Eugene不。。。不知道你在说什么。这两种策略(据我所知)几乎完全相同;尤其是在这种情况下。我能发现的唯一区别是,在没有标识的情况下使用
reduce
会导致创建一个不必要的
可选
。现在,如果身份是一个复杂的计算,那么我可以理解使用
可选的
-返回重载以及
orElseGet(供应商)
。(请注意,如果我完全误解了您,我很抱歉)@Slaw当流中只有一个元素时,这很重要(在当前的实现下-不知道这在将来的任何其他元素中是否重要)。假设有一个包含单个元素的流。当您使用
reduce(BigDecimal::add)
时,只有当有多个元素时才会调用该函数,否则该元素将被返回,这将使其成为一个超小的元素optimization@YCF_L当前位置你是如何达到3万英镑并仍然持有这种观点的?我不知道谁在这一页上投了反对票,但投票是匿名的,不需要证明。这已经在Meta上建立了很多次,需要有一个实质性的政策变化来要求选民证明他们的投票是正确的。这两个答案大部分都是代码,没有任何对问题或解决方案的真正解释,在这种情况下,虽然他们可能会帮助原始海报,但他们肯定不会帮助任何有类似问题的未来网站访问者,仅凭这一点就有资格获得否决票。@YCF_L:正如我告诉我的孩子们的,“但比利的妈妈让他这么做”的借口是站不住脚的。不管这个网站上的其他答案是否是代码,只有答案并不能让你的答案变得好。解释是关键,你的答案没有。@YCF_\L但你为什么要辩论这个问题而不是改进答案?改进它会带来什么损失?这个网站有什么好处?@YCF\L这些都是非常古老的答案。时代变了。现在,不鼓励只使用代码而不进行解释的答案。作为正确答案的上等投票者之一,我建议你只添加一些描述。这可能是让一些人投反对票的原因。