使用Java 8 Stream API减少Map

Fab*_*Fab 3 java hashmap java-8 java-stream

我有以下表格的地图:

Map<Integer, Map<String,Double>> START
Run Code Online (Sandbox Code Playgroud)

让INNER成为内部地图,即

Map<String,Double>
Run Code Online (Sandbox Code Playgroud)

例如,我想在新的地图中减少START地图

Map<Integer, Double> END
Run Code Online (Sandbox Code Playgroud)

它具有相同的键,但值不同.特别是,对于每个键,我希望新的Double值是INNER映射中相应键的值的SUM.

我怎样才能通过使用JAVA 8的STREAM 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   |
------------------------------
Run Code Online (Sandbox Code Playgroud)

我想要一个像以下一样的新地图:

--------------------------------
|      |                       |
| ID1  |  SUM(3.45,1.23,0.98)  |
|      |                       |
--------------------------------
|      |                       |
| ID2  |  SUM(1.00,2.00,3.00)  |
|      |                       |
--------------------------------
Run Code Online (Sandbox Code Playgroud)

Mor*_*van 9

它会对你有用

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


GRO*_*X13 6

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

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())));
    }

}
Run Code Online (Sandbox Code Playgroud)

输出将是,{1=5.66, 2=6.0}并且所有这一切都是获取地图的入口集,获取它的流并收集到内部地图值的新地图总和.