Java 根据条件比较数组列表中的对象字段值,如果条件为真,则删除
假设这些是JavaBean类-Java 根据条件比较数组列表中的对象字段值,如果条件为真,则删除,java,java-8,comparator,Java,Java 8,Comparator,假设这些是JavaBean类- class Camp { int number; User userId; Date createDt; } class User { private String id; private String name; } 我想从Camp类型的arrayList中删除那些具有相同userId但较少createDt的记录 假设这是列表- // ... the list is already populated List&
class Camp {
int number;
User userId;
Date createDt;
}
class User {
private String id;
private String name;
}
我想从Camp类型的arrayList中删除那些具有相同userId但较少createDt的记录
假设这是列表-
// ... the list is already populated
List<Camp> usersList = populatedListOfUser();
我没有从类型为Camp的arrayList中获取具有相同userId但较少createDt的记录
例如,如果我有两条记录具有相同的Camp.getUser.getId,但记录1的CreateDt大于记录2,那么我想删除记录2。您可以将代码更新为:
private List<Camp> skipByComparison(List<Camp> usersList){
Set<Camp> s = new TreeSet<>((o1, o2) -> o1.getUserId().getId().equals(o2.getUserId().getId()) ?
o1.getCreateDt().compareTo(o2.getCreateDt()) : 0);
s.addAll(usersList);
return new ArrayList<>(s);
}
说明:当两个日期可能相等时,比较器当前不会返回任何值,您可能只需要依赖compareTo实现Date类即可:
Set<Camp> s = new TreeSet<>(new Comparator<Camp>() {
@Override
public int compare(Camp o1, Camp o2) {
return o1.getUserId().getId().equals(o2.getUserId().getId())
? o1.getCreateDt().compareTo(o2.getCreateDt()) : 0;
}
});
完成此操作后,可以使用lambda表达式将其简化为:
Set<Camp> s = new TreeSet<>((o1, o2) -> o1.getUserId().getId().equals(o2.getUserId().getId())
? o1.getCreateDt().compareTo(o2.getCreateDt()) : 0);
我所做的其余修改是简化执行顺序和清除冗余初始化。
旁白:我刚刚在另一个问题中得到纠正,建议您也使用createDt属性。您可以使用toMap收集器:
Collection<Camp> values = usersList.stream()
.collect(toMap(c -> c.getUser().getId(),
Function.identity(),
BinaryOperator.maxBy(Comparator.comparing(Camp::getCreateDt))))
.values();
回答有关toMap如何工作的解释这个用户标识是什么?yiu是指用户用户ID吗?@john-是的。基本上,我只想在Camp.getUser.getId相同时删除那些没有最新CreateDt的记录。例如,如果我有两条记录具有相同的Camp.getUser.getId,但记录1的CreateDt大于记录2,那么我想删除记录2。skipByComparison中是否有回报?你们对最新的java8知识非常了解。棒 极 了
Set<Camp> s = new TreeSet<>(new Comparator<Camp>() {
@Override
public int compare(Camp o1, Camp o2) {
return o1.getUserId().getId().equals(o2.getUserId().getId())
? o1.getCreateDt().compareTo(o2.getCreateDt()) : 0;
}
});
Set<Camp> s = new TreeSet<>((o1, o2) -> o1.getUserId().getId().equals(o2.getUserId().getId())
? o1.getCreateDt().compareTo(o2.getCreateDt()) : 0);
Collection<Camp> values = usersList.stream()
.collect(toMap(c -> c.getUser().getId(),
Function.identity(),
BinaryOperator.maxBy(Comparator.comparing(Camp::getCreateDt))))
.values();