如何使用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
相关产品推荐
相关产品推荐

