根据两个日期(创建日期和更新日期)对记录的对象列表进行排序

时间:2017-09-22 21:11:33

标签: sorting collections java-8 java-stream comparator

在下面的例子中,我有一个有很多案例的部门。我需要从排序顺序基于udpatedTime的部门获取最新案例(如果udpatedTime为null则必须考虑createDate)并且必须返回列表中最新的一个项目(创建或更新) 。对于新创建的案例,在更新案例之前,updatetime将为null。

public class  Case{
    Long id;
    String number;
    String status;
    LocalDateTime createDate;
    String createdBy;
    LocalDateTime udpatedTime;
    String updatedBy;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public LocalDateTime getCreateDate() {
        return createDate;
    }

    public void setCreateDate(LocalDateTime createDate) {
        this.createDate = createDate;
    }

    public String getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public LocalDateTime getUdpatedTime() {
        return udpatedTime;
    }

    public void setUdpatedTime(LocalDateTime udpatedTime) {
        this.udpatedTime = udpatedTime;
    }

    public String getUpdatedBy() {
        return updatedBy;
    }

    public void setUpdatedBy(String updatedBy) {
        this.updatedBy = updatedBy;
    }
}





public class Department {
    String id;
    List<Case> allCases;

    Case latestCase;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public List<Case> getAllCases() {
        return allCases;
    }

    public void setAllCases(List<Case> allCases) {
        this.allCases = allCases;
    }

    public Case getLatestCase() {
        if (getAllCases().isEmpty()) {
            return null;
        }

        getAllCases().sort(new Comparator<Case>() {
            @Override
            public int compare(Case o1, Case o2) {
                if (o1.getUdpatedTime() != null) {
                    o1.getUdpatedTime().isAfter(o2.getUdpatedTime());
                } else if (o2.getUdpatedTime() != null) {
                    o1.getUdpatedTime().isAfter(o2.getUdpatedTime());
                }

                return 0;
            }
        });
return null;
    }
}

1 个答案:

答案 0 :(得分:3)

您无需对列表进行排序即可获取最新条目。只需使用max

import static java.util.Comparator.comparing;

getAllCases().stream()
     .max(comparing(
           c -> c.getUpdatedTime() == null ? c.getCreatedTime() : c.getUpdatedTime()
     ));

在java 9中,您可以使用c -> Objects.requireNonNullElse(c.getUpdatedTime(), c.getCreatedTime())

替换密钥提取器

c -> Objects.requireNonNullElseGet(c.getUpdatedTime(), c::getCreatedTime)(但这可能是矫枉过正的)