为了账号安全,请及时绑定邮箱和手机立即绑定

Java 8 添加对象列表的多个属性的值

Java 8 添加对象列表的多个属性的值

猛跑小猪 2021-10-06 11:01:45
假设我在下面有一个带有 getter 和 setter 的类,但只有默认构造函数。注意:我不允许改变这个类的结构。class Target {    private String year;    private String month;    private String name;    private double target;    private double achieved;    public String getYear() {        return year;    }    public void setYear(String year) {        this.year = year;    }    public String getMonth() {        return month;    }    public void setMonth(String month) {        this.month = month;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public double getTarget() {        return target;    }    public void setTarget(double target) {        this.target = target;    }    public double getAchieved() {        return achieved;    }    public void setAchieved(double achieved) {        this.achieved = achieved;    }    }我必须根据年份和名称添加 Target 和 Achieved 列值。Year Month Name Target Achieved2018  8    Joey 50.00   10.002018  9    Joey 200.00  100.002018  9    Fred 200.00  150.002018  9    Fred 20.00   50.00所以输出将是:Year Month Name Target  Achieved2018  8    Joey 50.00   10.002018  9    Joey 200.00  100.002018  9    Fred 220.00  200.00我已经看到一个例子,如果我有一个接受参数的构造函数,我如何实现这样的事情,但我对Group by 和 sum 对象的概念不是很清楚,比如在 SQL 中使用 Java lambdas?:如何仅使用默认构造函数来获得相同类型List<Target>但具有多列的计算值?
查看完整描述

2 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

似乎您需要根据三件事进行分组:Year,Month和Name,因此这可能如下所示:


Collection<Target> merged = yourListOfTargets

            .stream()

            .collect(Collectors.toMap(

                    t -> List.of(t.getYear(), t.getMonth(), t.getName()),

                    Function.identity(),

                    (left, right) -> {

                        left.setTarget(left.getTarget() + right.getTarget());

                        left.setAchieved(left.getAchieved() + right.getAchieved());

                        return left;

                    }))

            .values();

正如 Federico 在评论中提到的,这将改变您在初始List. 您可能会接受它,但如果不是,则需要替换Function.identity()为一个复制功能,该功能Target将从现有功能中创建一个新功能。


查看完整回答
反对 回复 2021-10-06
  • 2 回答
  • 0 关注
  • 299 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号