java - 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;
}
}
我必须根据年份和名称添加目标和实现的列值。
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 objects 的概念不太清楚,比如在 SQL 中使用 Java lambdas?:
如何仅使用默认构造函数来获得相同类型List<Target>
但具有多列的计算值?
解决方案
看来您需要根据三件事进行分组:和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
推荐阅读
- java - Spring Boot - SQS 消费者健康检查
- jquery - Wordpress 正在杀死我的脚本
- apache-spark - 在没有 Thrift 服务器的情况下连接到 spark 和访问 hive 表
- jenkins - 如何将 Windows 发送到在管道内运行的作业的命令
- r - jsonlite 正在创建一个带有类 data.frame 列的 data.frame
- spring - Spring Boot Devtools:从重启类加载器中排除多个模块
- redirect - cloudfront 和 s3 301 重定向显示存储桶的裸域
- docusignapi - DocuSign 以前的签名者信息
- java - Spark2 shell 退出,并在线程“main”java.lang.IllegalArgumentException 中出现异常:MALFORMED 错误
- ios - 使用贝塞尔路径快速绘制圆圈