Java map/collect 用于流对列表列表求和

标签 java java-stream

我正在使用 Java 8,以及包 java.util.stream 中的 Map、Reduce、Collect API 。 我有一个用例,我需要对列表的列表进行垂直求和。 我的列表的结构是 List<List<Integer>> 我只是想不出一种方法可以使用映射来压缩内部列表,并减少或收集流上可用的操作。 考虑以下代码。 假设我的列表名为 transactions 。 此交易存储的是内部列表中每个商品的每笔交易中售出的商品数量。内部 list 的长度对于所有交易都是相同的,因为它包含库存中每一项的一个条目。如果该项目未参与交易,则仅存储 0。

我在想一些类似的事情

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

我只是不知道如何在代码中实现这一点。 网络上的所有资源都是简单的示例,不适用于集合对象。任何指示/提示将不胜感激。

最佳答案

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

关于Java map/collect 用于流对列表列表求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50202637/

相关文章:

JavaFX 和 Java

Java Stream sortBy 和 filter()

java - 如何使用流将列表转换为带有索引的 map - Java 8?

java - Stream if not null 并获取第一个对象

java - 如何从列表中删除重复的对象

java - 在 Vertx (Vert.x 3) 中异步运行多个 Sql 查询

java - 如何在开关盒中使用枚举

java - 如何在满足条件后停止值事件监听器的监听

java-8 - 方法引用不履行功能接口(interface)契约,但可以编译。怎么可能?

java - 使用java流从集合集合中删除一些值