You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java:如何通过Stream从对象列表计算累计预算

在Stream处理中直接计算累计预算

这问题问得很实用!要实现不先提取预算列表,直接在Stream流处理过程中计算每个条目的累计预算,关键是要在流操作里维护一个有状态的累加器,下面给你具体的解决方案和细节说明:

先纠正原代码的小问题

你原来的代码里map(NameBudget::getBudget())写法有误,方法引用不需要加括号,正确的写法是NameBudget::getBudget,不然编译会报错哦。

核心解决方案:用原子类作为累加器

我们可以用AtomicInteger来作为累加容器,它能在流的map操作里安全地更新并返回累计值,直接收集成目标列表:

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

// 假设你的NameBudget类已经正确实现了getBudget()方法
class NameBudget {
    String name;
    Integer budget;

    public Integer getBudget() {
        return budget;
    }

    // 构造器等其他方法省略
    public NameBudget(String name, Integer budget) {
        this.name = name;
        this.budget = budget;
    }
}

// 处理逻辑
public class CumulativeBudgetDemo {
    public static void main(String[] args) {
        List<NameBudget> listOfNameBudgets = List.of(
            new NameBudget("A", 100),
            new NameBudget("B", 200),
            new NameBudget("C", 150)
        );

        AtomicInteger cumulativeSum = new AtomicInteger(0);
        List<Integer> cumulativeBudgets = listOfNameBudgets.stream()
            .map(nameBudget -> cumulativeSum.addAndGet(nameBudget.getBudget()))
            .collect(Collectors.toList());

        // 输出结果:[100, 300, 450]
        System.out.println(cumulativeBudgets);
    }
}

原理说明

  • AtomicInteger的addAndGet()方法会原子性地把当前预算值加到累计总和里,并返回更新后的总和,这样每个map操作返回的就是到当前条目为止的累计预算。
  • 整个过程不需要先提取所有预算到单独列表,完全在Stream的处理流程中完成。

备选方案:自定义累加器类

如果你不想用原子类,也可以自定义一个简单的累加器类(利用引用类型的特性,让lambda可以修改其内部属性):

class Accumulator {
    int total = 0;
}

// 处理逻辑
Accumulator acc = new Accumulator();
List<Integer> cumulativeBudgets = listOfNameBudgets.stream()
    .map(nb -> {
        acc.total += nb.getBudget();
        return acc.total;
    })
    .collect(Collectors.toList());

这个方案逻辑更直白,但AtomicInteger自带线程安全特性,在串行流场景下两者效果一致,推荐优先用原子类方案。

注意事项

⚠️ 如果使用并行流(parallelStream()),虽然AtomicInteger是线程安全的,但由于并行处理的顺序不确定,最终的累计结果可能不符合“按原列表顺序累计”的预期。如果你的业务场景是按原列表顺序计算累计,建议使用串行流即可。

内容的提问来源于stack exchange,提问作者Himanshu Yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:19:34