Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据条件比较数组列表中的对象字段值,如果条件为真,则删除_Java_Java 8_Comparator - Fatal编程技术网

Java 根据条件比较数组列表中的对象字段值,如果条件为真,则删除

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&

假设这些是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<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();