有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Java8流API减少hashmap映射

我有一张以下格式的地图:

Map<Integer, Map<String,Double>> START

设INNER为内部映射,即

Map<String,Double>

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

Map<Integer, Double> END

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

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

谢谢大家

编辑:创建一个示例地图

------------------------------
|      |  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   |
------------------------------

e我想要一张新地图,如下所示:

--------------------------------
|      |                       |
| ID1  |  SUM(3.45,1.23,0.98)  |
|      |                       |
--------------------------------
|      |                       |
| ID2  |  SUM(1.00,2.00,3.00)  |
|      |                       |
--------------------------------

共 (2) 个答案

  1. # 1 楼答案

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

    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},它所做的一切就是获取映射的入口集,获取它的流,并收集内部映射值的新映射和

  2. # 2 楼答案

    它会对你有用的

        Map<Integer, Double> collect = START.entrySet()
            .stream()
            .collect(
                Collectors.toMap(
                    Map.Entry::getKey, 
                    e -> e.getValue()
                          .values()
                          .stream()
                          .reduce(0d, (a, b) -> a + b)
                    )
            );