首页 > 解决方案 > 根据多个字段过滤对象的 ArrayList

问题描述

所以这是我的课:

class A {
    private int id;
    private TimeStamp startDate;
    private TimeStamp endDate;
    private String source;
}

我有一个List<A> list1

因此,在此列表中,如果任何两个对象相同startDate且相同,source则我需要选择更高的对象endDate。我怎样才能实现它?

我当前的实现:(它只检查startDate而不是source然后选择更高的endDate值)

Collection<A> result =
            
list1.stream()
        .collect(Collectors.toMap(A::getStartDate,
                                  Function.identity(),
                                  (a, b) -> a.getEndDate().after(b.getEndDate()) ? a : b))
        .values();

我如何扩展此代码以检查源代码或任何其他实现来做同样的事情也很好......

标签: javaclassarraylistjava-8java-stream

解决方案


您可以添加一个基于andA生成密钥的方法。然后你可以在:StringstartDatesourcetoMap

class A {
    private int id;
    private TimeStamp startDate;
    private TimeStamp endDate;
    private String source;
    
    public String getKey() {
        return this.startDate.toString() + source;
    }
}

list1.stream()
        .collect(Collectors.toMap(A::getKey,
                                  Function.identity(),
                                  (a, b) -> a.getEndDate().after(b.getEndDate()) ? a : b))
        .values();

推荐阅读