繁体   English   中英

Java映射/收集流以汇总列表列表

[英]Java map / collect for Stream to sum List of Lists

我正在使用Java 8,以及来自包java.util.stream的Map,Reduce,Collect API。 我有一个用例,我需要垂直汇总列表的列表。 我列表的结构是List<List<Integer>>我只是想不出一种方法,可以使用地图挤压内部List,并减少或收集流中可用的操作。 考虑以下代码。 说我的清单被命名为transactions 该交易存储的是内部列表中每个项目在每个交易中出售的项目数量。 内部清单的长度对于所有交易而言都是相同的,因为它包含库存中每个物料的一项。 如果该项目不参与交易,则仅存储0。

我在想些什么

transaction.stream().map(
      /*Try and put sum into an accumulator List*/
).collect(
      /*Collect entries into a list*/
)

我只是不知道如何在代码中实现这一点。 Web上的所有资源都是琐碎的示例,不适用于集合对象。 任何指针/技巧将不胜感激。

因为您有一个List<List<Integer>> ,所以似乎垂直和应该产生一个List<Integer> ,因为每一列都有自己的和。 假设List<List<Integer>>中的每一行都包含相同数量的元素,最好首先找到List<List<Integer>>的转置,将每一行求和,然后将其收集回一个List<Integer> 您可以使用以下方法进行操作:

List<List<Integer>> list = Arrays.asList(
    Arrays.asList(1, 2, 3, 4),
    Arrays.asList(5, 6, 7, 8)
);

List<Integer> sumList = IntStream.range(0, list.get(0).size())
                                 .mapToObj(i -> list.stream()
                                                    .mapToInt(l -> l.get(i))
                                                    .sum())
                                 .collect(Collectors.toList());

System.out.println(sumList);

输出:

[6, 8, 10, 12]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM