Java 8 个流从单个 Map 中的两个或多个列表添加值
Java 8 streams adding values from two or more lists in single Map
我有一个如下所示的数组列表:
stackedBarChart.stackedBarChartSeries.data.add(1,2,3)
stackedBarChart.stackedBarChartSeries.data.add(3,4,5)
stackedBarChart.stackedBarChartSeries.data.add(4,5,6)
stackedBarChart.stackedBarChartSeries.data.add(6,7,8)
还有另一个列表
stackedBarChart.XAxis.add("Jan","Feb","March")
我想制作 Map ,其中 map 如下所示:
1 月 = 14,2 月 = 18,3 月 = 22
其中每个值表示从 stackedBarChart 添加 arraylist 的每个索引。
现在我已经使用如下简单的 for 循环完成了此操作:
stackedBarChart.stackedBarChartSeries.forEach(stackedBarChartTableDataList ->{
for(int i = 0; i < stackedBarChart.getXAxis().size();i++) {
Integer stackedBarChartTableData = stackedBarChartTableDataList.getData().get(i);
String stackedBarChartTableCurrentColumnName = stackedBarChart.getXAxis().get(i);
stackedBarChartTableColumnSumMap.merge(stackedBarChartTableCurrentColumnName, stackedBarChartTableData, Integer::sum);
}
})
我想要一个简单的解决方案来使用流或除使用 for 循环之外的任何其他简单方法来实现此目的。
你能帮我解决这个问题吗?
编辑:
这是对象表示:
{
"stackedBarChart": {
"stackedBarChartSeries": [
{
"data": [
1,
2,
3
]
},
{
"data": [
3,
4,
5
]
},
{
"data": [
4,
5,
6
]
},
{
"data": [
6,
7,
8
]
}
]
},
"xAxis": [
"Jan 2021",
"Feb 2021",
"Mar 2021"
]
}
这应该可以解决问题:
public static Map<String, Integer> mergeBySum(Map<String, Integer> map1, Map<String, Integer> map2) {
return Stream.of(map1, map2)
.map(Map::entrySet)
.flatMap(Set::stream)
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (u1, u2) -> u1 + u2));
}
public Map<String, Integer> sumByMonth(/*bar chart type*/ stackedBarChart) {
List<String> xAxis = stackedBarChart.getXAxis();
int axisLength = xAxis.size();
return stackedBarChart.stream().map(stackedBarChartTableDataList ->
IntStream.range(0, axisLength).boxed().collect(Collectors.toMap(xAxis::get, stackedBarChartTableDataList::get))
).reduce((map1, map2) -> mergeBySum(map1, map2)).orElse(Collections.EMPTY_MAP);
}
来自 https://whosebug.com/users/3669698/hadi-j,
stackedBarChart.stackedBarChartSeries.forEach(sbcs ->
IntStream.range(0, stackedBarChart.getxAxis().size())
.forEach(i -> stackedBarChartTableColumnSumMap.merge(stackedBarChart.getxAxis().get(i), sbcs.getData().get(i),
Integer::sum)));
我有一个如下所示的数组列表:
stackedBarChart.stackedBarChartSeries.data.add(1,2,3)
stackedBarChart.stackedBarChartSeries.data.add(3,4,5)
stackedBarChart.stackedBarChartSeries.data.add(4,5,6)
stackedBarChart.stackedBarChartSeries.data.add(6,7,8)
还有另一个列表
stackedBarChart.XAxis.add("Jan","Feb","March")
我想制作 Map
1 月 = 14,2 月 = 18,3 月 = 22
其中每个值表示从 stackedBarChart 添加 arraylist 的每个索引。
现在我已经使用如下简单的 for 循环完成了此操作:
stackedBarChart.stackedBarChartSeries.forEach(stackedBarChartTableDataList ->{
for(int i = 0; i < stackedBarChart.getXAxis().size();i++) {
Integer stackedBarChartTableData = stackedBarChartTableDataList.getData().get(i);
String stackedBarChartTableCurrentColumnName = stackedBarChart.getXAxis().get(i);
stackedBarChartTableColumnSumMap.merge(stackedBarChartTableCurrentColumnName, stackedBarChartTableData, Integer::sum);
}
})
我想要一个简单的解决方案来使用流或除使用 for 循环之外的任何其他简单方法来实现此目的。
你能帮我解决这个问题吗?
编辑:
这是对象表示:
{
"stackedBarChart": {
"stackedBarChartSeries": [
{
"data": [
1,
2,
3
]
},
{
"data": [
3,
4,
5
]
},
{
"data": [
4,
5,
6
]
},
{
"data": [
6,
7,
8
]
}
]
},
"xAxis": [
"Jan 2021",
"Feb 2021",
"Mar 2021"
]
}
这应该可以解决问题:
public static Map<String, Integer> mergeBySum(Map<String, Integer> map1, Map<String, Integer> map2) {
return Stream.of(map1, map2)
.map(Map::entrySet)
.flatMap(Set::stream)
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (u1, u2) -> u1 + u2));
}
public Map<String, Integer> sumByMonth(/*bar chart type*/ stackedBarChart) {
List<String> xAxis = stackedBarChart.getXAxis();
int axisLength = xAxis.size();
return stackedBarChart.stream().map(stackedBarChartTableDataList ->
IntStream.range(0, axisLength).boxed().collect(Collectors.toMap(xAxis::get, stackedBarChartTableDataList::get))
).reduce((map1, map2) -> mergeBySum(map1, map2)).orElse(Collections.EMPTY_MAP);
}
来自 https://whosebug.com/users/3669698/hadi-j,
stackedBarChart.stackedBarChartSeries.forEach(sbcs ->
IntStream.range(0, stackedBarChart.getxAxis().size())
.forEach(i -> stackedBarChartTableColumnSumMap.merge(stackedBarChart.getxAxis().get(i), sbcs.getData().get(i),
Integer::sum)));