首页 文章

Java map / collect for Stream to sum List of List

提问于
浏览
2

我正在使用Java 8,以及来自包 java.util.stream 的Map,Reduce,Collect API . 我有一个用例,我需要垂直排列列表 . 我的列表的结构是 List<List<Integer>> 我只是想不出可以使用 Map 压缩内部列表的方法,并减少或收集流上可用的操作 . 请考虑以下代码 . 说我的名单名为 transactions . 此事务存储的内容是内部列表中每个项目在每个事务中销售的项目数量 . 内部列表的长度对于所有事务都是相同的,因为它包含清单中每个项目的一个条目 . 如果该项目不参与交易,则只存储0 .

我正在思考一些问题

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

我只是无法想象如何在代码中实现这一点 . Web上的所有资源都是无法处理集合对象的简单示例 . 任何指针/提示将非常感激 .

1 回答

  • 3

    因为你有 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]
    

相关问题