You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Comparator获取优先含最大accountUpdateDate的Person对象

完善Comparator实现方案

嘿,我来帮你搞定这个Comparator的实现!根据你的需求,我们需要优先按最大的有效accountUpdateDate排序,当没有有效日期时再按最大的updateDate排序。下面是完整的实现代码,我会一步步解释逻辑:

import java.time.Instant;
import java.util.Comparator;
import java.util.Objects;

// 完整的Comparator实现
Comparator<Person> UPDATE_DATE_COMPARATOR = Comparator
    .comparing(
        // 提取每个Person的最大有效accountUpdateDate,无有效日期则返回null
        person -> person.getAccounts() == null ? null :
            person.getAccounts().stream()
                .map(Account::getAccountUpdateDate)
                .filter(Objects::nonNull) // 过滤掉null的accountUpdateDate
                .max(Instant::compareTo) // 找出最大的日期
                .orElse(null), // 没有有效日期时返回null
        // 比较规则:有有效日期的优先,同有有效日期则按日期从晚到早排
        Comparator.nullsLast(Instant::compareTo)
    )
    // 当accountUpdateDate规则无法区分时,按updateDate从晚到早排(因为updateDate是必填项)
    .thenComparing(Person::getUpdateDate);

// 调用方式不变
Collections.max(personList, UPDATE_DATE_COMPARATOR);

关键逻辑拆解

  • 提取最大有效accountUpdateDate:
    先处理accounts为null的情况,避免空指针;接着过滤掉所有accountUpdateDate为null的账户,再找出剩余日期中的最大值。如果没有任何有效日期(accounts为空或所有日期都是null),则返回null。

  • 第一层比较规则(nullsLast):
    使用nullsLast确保有有效accountUpdateDate的Person永远排在没有的前面,而有有效日期的Person之间,按Instant的自然顺序(晚的日期更大)比较,这样Collections.max会直接选中日期最晚的那个。

  • 第二层比较规则(updateDate):
    当两个Person都没有有效accountUpdateDate,或者他们的最大accountUpdateDate相同时,就按必填的updateDate排序,同样自然顺序下晚的日期更大,完全符合需求。

测试场景验证

  • 场景1:PersonA有一个账户的accountUpdateDate是2024-03-01,PersonB无账户但updateDate是2024-04-01 → 会选中PersonA(优先有效accountUpdateDate)
  • 场景2:PersonC的所有账户accountUpdateDate都是null,PersonD无账户 → 会选中updateDate更大的那个
  • 场景3:PersonE的最大accountUpdateDate是2024-02-01,PersonF的是2024-03-01 → 会选中PersonF

内容的提问来源于stack exchange,提问作者rennajihi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:12:28