使用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)
)
);