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

标签 sorting collections java-8 java-stream comparator

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

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()
     ));

在 java 9 中,您可以使用 c -> Objects.requireNonNullElse(c.getUpdatedTime(), c.getCreatedTime()) 替换 key 提取器

c -> Objects.requireNonNullElseGet(c.getUpdatedTime(), c::getCreatedTime)(但这可能有点过头了)

关于sorting - 根据两个日期(创建日期和更新日期)对记录的对象列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46373268/

相关文章:

Ruby Hash - 按值排序和打印键

Magento - 将邮政编码/邮政编码添加到 Magento 1.6.2 中的订单网格中

java - 我需要保留按 "ranking"属性排序的对象集合,即使我获得了集合中已有的更多对象

java - 除了 ConcurrentLinkedQueue,我是否需要使用带锁的 LinkedList?

python - 在Python中对数据文件进行排序

javascript - 对动态填充的对象数组进行排序

sqlite - 对整个 SQLite 表进行排序

Java HashMap 哈希函数

Java 8如何使用数组中的id从数组列表中删除项目

lambda - java 8流-如果没有找到就处理