因此,我有一个列表,其中包含来自数据库的具有相同“ Id”的重复实体(不是真正的Id,而是一种),但具有不同的CreatedDate.
因此,我想从重复项中获取具有最新CreatedDate的最新实体.
示例我有一个创建的用户列表:
RealId|CreatedDate|Id|Name
1|20170101|1|User1
2|20170102|1|User1Modified
3|20170103|2|User2
4|20170104|2|User2Modified
从该列表中获得最佳方法是:
RealId|CreatedDate|Id|Name
2|20170102|1|User1Modified
4|20170104|2|User2Modified
这是我的第一个主意
List r = query.getResultList();
Set distinct = r.stream().filter(x -> {
List clones = r.stream()
.filter(y -> y.getId() == x.getId())
.collect(Collectors.toList());
T max = clones.stream()
.max(Comparator.comparing(AbstractEntityHistory::getEntryDate))
.get();
return max.getNumber() == x.getNumber();
}).collect(Collectors.toSet());
我的另一个想法是使它按日期降序排列,然后像下面这样进行distinct().collect():
Set distinct2 = r.stream().sorted((x,y) -> {
if(x.getEntryDate().isBefore(y.getEntryDate())) {
return 1;
} else if(x.getEntryDate().isAfter(y.getEntryDate())) {
return -1;
} else {
return 0;
}
}).distinct().collect(Collectors.toSet());
在这里,T覆盖等于,如果它们相等则监视RealId,否则将使用反射来监视其他所有字段.