java - 想要通过按属性对其他对象列表进行分组来创建新列表
问题描述
想要通过按属性将其他对象列表分组来创建列表,代码是这样的:
public class MyDate {
public static void main(String[] args) {
List<Data> list = new ArrayList<>();
list.add(new Data("NEW",todayDate,todayDatePlus1,"N"));
list.add(new Data("AUTORIZED",todayDate,todayDatePlus1,"Y"));
list.add(new Data("AUTORIZED",todayDatePlus1,todayDatePlus3,"Y"));
list.add(new Data("AUTHENTICATE",todayDate,todayDatePlus1,"Y"));
list.add(new Data("AUTHENTICATE",todayDatePlus1,todayDatePlus2,"Y"));
list.add(new Data("COMPLETED",todayDate,todayDatePlus1,"N"));
}
}
@Getter
@Setter
class Data{
String phase;
LocalDate startDate;
LocalDate endDate;
String required;
Data(String phase, LocalDate startDate, LocalDate endDate, String required) {
this.phase = phase;
this.startDate = startDate;
this.endDate = endDate;
this.required = required;
}
}
输出:
In New List
("NEW",todayDate,todayDatePlus1,"N")
**("AUTORIZED",todayDate,todayDatePlus3,"Y")**
**("AUTHENTICATE",todayDate,todayDatePlus2,"Y")**
("COMPLETED",todayDate,todayDatePlus1,"N")
在新列表中,重复属性阶段组合为 1,并且 StartDate 和 EndDate 也被更新。(StartDate Earlist 一个和 EndDate 作为最后一个)
解决方案
您可以使用 Collectors.toMap 和mergefunction
, 来合并Data
具有相同对象的值phase
Collection<Data> result = list.stream()
.collect(Collectors.toMap(Data::getPhase, Function.identity(), ((existing, replacement) -> {
// Merge values of replacement with existing
existing.setEndDate(replacement.getEndDate());
return existing;
}))).values();
推荐阅读
- bash - 为什么 bash 将 git checkout 参数误认为是此脚本中的命令?
- javascript - 用于获取网页输出的 powershell 脚本,其中包括用于表单的 javascripts
- javascript - 如何使用 node.js twit 回复某人的推文?
- php - 从另一个数组内部拉出正则表达式输出数组
- html - 防止子元素拉伸父元素:Chrome 和 Safari 的便携解决方案?
- typescript - 无法通过动态字符串访问“this”对象
- windows - Windows 10,Git Bash - bash: git: command not found
- docker-compose - 使用 Docker 和 Traefik 的有效 HTTPS 证书
- sqlite - 如何用flutter sqlite存储所有数据?
- angularjs - ionic 5 页面转换 url 更改但上一页仍然可见