Java Stream如何基于日期、时间双属性查找集合最大元素
解答
完全可以通过Stream API实现日期、时间均为最新的Employee对象查找。
你现有实现存在明确缺陷:
- 当前比较器仅配置了
date属性的比较规则,当集合中存在多条date取值相同的记录时,比较器会判定这些记录权重相等,max()方法无法区分同日期下不同时间的先后顺序,返回结果存在不确定性,无法保证取到同日期下时间最新的对象。
正确实现只需要在原有日期比较规则的基础上,链式追加时间属性的比较逻辑即可。由于你存储的日期为yyyy-MM-dd格式、时间为HH:mm格式,字符串的字典序和实际时间先后顺序完全一致,不需要额外做日期格式转换,直接调用thenComparing拼接时间比较规则就可以满足需求,代码如下:
// 比较规则:优先按日期排序,日期相同时按时间排序 Comparator<Employee> employeeComparator = Comparator .comparing(Employee::getDate) .thenComparing(Employee::getTime); // 取日期+时间最新的对象,显式处理空集合场景 Employee latestEmp = empList.stream() .max(employeeComparator) .orElseThrow(() -> new RuntimeException("员工集合为空,无有效数据"));
提示:不建议直接调用Optional的
get()方法取值,当集合为空时会直接抛出无元素的异常,推荐使用orElseThrow()、orElse()等方法显式定义空集合的处理逻辑,代码健壮性更好。
针对你给出的测试用例,上述逻辑会先筛选出日期最新的2条2022-07-07的记录,再比对两者的时间值,最终返回id为1、时间为15:31的Employee对象,和预期结果完全一致。
内容的提问来源于stack exchange,提问作者acG
相关产品推荐
相关产品推荐

