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)
它会对你有用
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)
这应该是一个很好的例子:
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}并且所有这一切都是获取地图的入口集,获取它的流并收集到内部地图值的新地图总和.
| 归档时间: |
|
| 查看次数: |
12786 次 |
| 最近记录: |