使用Java8流API减少映射

使用Java8流API减少映射,java,hashmap,java-8,java-stream,Java,Hashmap,Java 8,Java Stream,我有一张以下格式的地图: Map<Integer, Map<String,Double>> START e我想要一张新地图,如下所示: -------------------------------- | | | | ID1 | SUM(3.45,1.23,0.98) | | | | -------------------------------- |

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

Map<Integer, Map<String,Double>> START
e我想要一张新地图,如下所示:

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

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

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

}
公共类主{
公共静态void main(最终字符串[]args){
final Map tmp=new HashMap();
put(1,新的HashMap(){{
付诸表决(“1”,3.45);
付诸表决(“2”,1.23);
put(“3”,0.98);
}});
put(2,新的HashMap(){{
付诸表决(“1”,1.00);
付诸表决(“2”,2.00);
付诸表决(“3”,3.00);
}});
System.out.println(tmp.entrySet().stream())
.收集(
toMap(Map.Entry::getKey,
数据->
data.getValue()
.values().stream()
.mapToDouble(Number::doubleValue).sum());
}
}
输出将是
{1=5.66,2=6.0}
,它所做的一切就是获取映射的入口集,获取它的流,并收集内部映射值的新映射和

这对你有用

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

为什么内部地图的键是字符串?你能提供一个示例地图吗?我想使用流API,因为我是新手,我需要更好地理解它。你尝试了什么?给我们看看你的代码。@talex关于流API,我还没有写任何代码。在旧代码中,我迭代了哈希映射,逐键执行求和操作。现在,我的目标是通过使用Stream实现相同的结果,而不是使用Stream编写所有代码hand@Fab你为什么不自己试试呢?如果您使用其他人为您编写的代码,您将永远不会学到任何东西。您的代码给我以下错误:类型Start的方法toMap(Map.Entry::getKey,(data)->{}未定义另一个答案通过流式
entrySet()
而不是
keySet()
保存一次查找。
--------------------------------
|      |                       |
| ID1  |  SUM(3.45,1.23,0.98)  |
|      |                       |
--------------------------------
|      |                       |
| ID2  |  SUM(1.00,2.00,3.00)  |
|      |                       |
--------------------------------
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())));
    }

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