当前位置: 首页 > 知识库问答 >
问题:

映射到Java 8中的运行求和

曾修真
2023-03-14
List<Long> numbers = asList(2, 2, 4, 5);

我如何映射/处理这些以建立一个运行的总数。产生象这样的东西:

List<Long> runningTotals = asList(2, 4, 8, 13);

更好的是,我如何构建一个列表(比如元组),这样我就可以保留原始的内容:

((2 -> 2), (2 -> 4), (4 -> 8), (5 -> 13));

共有1个答案

严繁
2023-03-14

更新:正如Holger在注释中指出的,为此使用stream.reduce()是不正确的。有关更多信息,请参见Reduction和可变Reduction或Java8Streams-Collect vs reduce。

您可以使用Javastream.collection()生成包含和的列表:

List<Long> numbers = Arrays.asList(2L, 2L, 4L, 5L);
List<Pair> results = numbers.stream()
        .collect(ArrayList::new, (sums, number) -> {
            if (sums.isEmpty()) {
                sums.add(new Pair(number, number));
            } else {
                sums.add(new Pair(number, number + sums.get(sums.size() - 1).getSum()));
            }
        }, (sums1, sums2) -> {
            if (!sums1.isEmpty()) {
                long sum = sums1.get(sums1.size() - 1).getSum();
                sums2.forEach(p -> p.setSum(p.getSum() + sum));
            }
            sums1.addAll(sums2);
        });

这将合并所有的数字,并为每个数字创建一对,加上前一个和的加法。它使用以下pair类作为帮助器:

public class Pair {
    private long number;
    private long sum;

    public Pair(long number, long sum) {
        this.number = number;
        this.sum = sum;
    }

    public long getNumber() {
        return number;
    }

    public void setSum(long sum) {
        this.sum = sum;
    }

    public long getSum() {
        return sum;
    }
}
[
    Pair{number=2, sum=2}, 
    Pair{number=2, sum=4}, 
    Pair{number=4, sum=8}, 
    Pair{number=5, sum=13}
]
 类似资料:
  • 在计算之前。对列表执行以下操作: 将事务处理按年份分组 然后按方法分组 最后产生的对象应该有平均值、年份和方法的值。

  • 我有一个问题与转换列表对象映射字符串,列表对象。我正在寻找与一个关键名称的汽车所有组件的地图,一个值由汽车与此组件表示 我写了一个解决方案,但寻找一个更好的流解决方案。

  • 我知道如何变换

  • Web 容器需要本章描述的映射技术去映射客户端请求到 Servlet(该规范2.5以前的版本,使用这些映射技术是作为一个建议而不是要求,允许servlet 容器各有其不同的策略用于映射客户端请求到 servlet)。

  • 我正在从文件中读取值并获取列表。如下- 一旦我得到这个

  • 我在迭代一个对象内的列表时遇到了一个问题,该对象内嵌在另一个映射中。我的目标是迭代这个列表并生成一个映射 ,我希望使用streams和lamdas来实现这一点。 我在上面看到了,我需要通过迭代FolderBo中的elementList从elementBo创建一个带有map 的映射。folderBo本身就在Modelbo的地图内。