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

sort the list of objects for a record based on two dates(create date and update date)

在下面的例子中,我有一个部门有很多案例。我需要从排序顺序基于 udpatedTime 的部门获取最新案例(如果 udpatedTime 为 null 必须考虑 createDate)并且必须 return 列表中的第一项是最新的(要么创建或更新)。对于新创建的案例,更新时间将为空,直到案例被更新。

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;
    }
}

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

import static java.util.Comparator.comparing;

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

在java9中,可以用c -> Objects.requireNonNullElse(c.getUpdatedTime(), c.getCreatedTime())

替换key extractor

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