首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java 8 Stream API减少Map

使用Java 8 Stream API减少Map
EN

Stack Overflow用户
提问于 2016-10-04 19:40:20
回答 2查看 24.9K关注 0票数 12

我有一个如下形式的Map:

代码语言:javascript
复制
Map<Integer, Map<String,Double>> START

设INNER是内部映射,即

代码语言:javascript
复制
Map<String,Double>

例如,我想在一个新的地图中减少起始地图

代码语言:javascript
复制
Map<Integer, Double> END

它们具有相同的键,但值不同。特别是,对于每个键,我希望新的双精度值是对应键的内部映射中值的总和。

我如何使用Java8的流API来实现这一点?

谢谢大家。

编辑:示例地图为

代码语言:javascript
复制
------------------------------
|      |  2016-10-02   3.45   |
| ID1  |  2016-10-03   1.23   |
|      |  2016-10-04   0.98   |
------------------------------
|      |  2016-10-02   1.00   |
| ID2  |  2016-10-03   2.00   |
|      |  2016-10-04   3.00   |
------------------------------

我想要一张新地图,就像下面这样:

代码语言:javascript
复制
--------------------------------
|      |                       |
| ID1  |  SUM(3.45,1.23,0.98)  |
|      |                       |
--------------------------------
|      |                       |
| ID2  |  SUM(1.00,2.00,3.00)  |
|      |                       |
--------------------------------
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-04 20:23:00

它会为你工作的

代码语言:javascript
复制
    Map<Integer, Double> collect = START.entrySet()
        .stream()
        .collect(
            Collectors.toMap(
                Map.Entry::getKey, 
                e -> e.getValue()
                      .values()
                      .stream()
                      .reduce(0d, (a, b) -> a + b)
                )
        );
票数 12
EN

Stack Overflow用户

发布于 2016-10-04 20:07:55

这应该是一个很好的例子:

代码语言:javascript
复制
public class Main {

    public static void main(final String[] args) {
        final Map<Integer, Map<String, Double>> tmp = new HashMap<>();
        tmp.put(1, new HashMap<String, Double>() {{
            put("1", 3.45);
            put("2", 1.23);
            put("3", 0.98);
        }});
        tmp.put(2, new HashMap<String, Double>() {{
            put("1", 1.00);
            put("2", 2.00);
            put("3", 3.00);
        }});

        System.out.println(tmp.entrySet().stream()
                .collect(
                    toMap(Map.Entry::getKey, 
                    data -> 
                        data.getValue()
                            .values().stream()
                            .mapToDouble(Number::doubleValue).sum())));
    }

}

输出将是{1=5.66, 2=6.0},所做的所有工作就是获取map的条目集,获取它的流,并收集到内部map值的新map和。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39851350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档