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

假设我在下面有一个带有 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 Achieved

2018  8    Joey 50.00   10.00

2018  9    Joey 200.00  100.00

2018  9    Fred 200.00  150.00

2018  9    Fred 20.00   50.00

所以输出将是:


Year Month Name Target  Achieved

2018  8    Joey 50.00   10.00

2018  9    Joey 200.00  100.00

2018  9    Fred 220.00  200.00

我已经看到一个例子,如果我有一个接受参数的构造函数,我如何实现这样的事情,但我对Group by 和 sum 对象的概念不是很清楚,比如在 SQL 中使用 Java lambdas?:


如何仅使用默认构造函数来获得相同类型List<Target>但具有多列的计算值?


猛跑小猪
浏览 327回答 2
2回答

互换的青春

似乎您需要根据三件事进行分组:Year,Month和Name,因此这可能如下所示:Collection<Target> merged = yourListOfTargets&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toMap(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t -> List.of(t.getYear(), t.getMonth(), t.getName()),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Function.identity(),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (left, right) -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; left.setTarget(left.getTarget() + right.getTarget());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; left.setAchieved(left.getAchieved() + right.getAchieved());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return left;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .values();正如 Federico 在评论中提到的,这将改变您在初始List. 您可能会接受它,但如果不是,则需要替换Function.identity()为一个复制功能,该功能Target将从现有功能中创建一个新功能。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java