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