如何使用Java 8从对象列表中找出小于等于指定日期的最大日期
使用Java 8 Streams API找出符合条件的最大出生日期
你需要从Person对象列表中筛选出出生日期小于等于指定日期的记录,并找出其中最大的出生日期,以下是用Java 8 Streams API实现的方案:
修改后的完整代码
import java.time.LocalDate; import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class Main { public static void main(String[] args) { List<Person> persons = getPersonList(); LocalDate myDob = LocalDate.of(2022, 9, 30); LocalDate maxDate = persons.stream() // 过滤出出生日期小于等于指定日期的Person .filter(p -> p.getDateOfBirth().compareTo(myDob) <= 0) // 将Person映射为对应的出生日期 .map(Person::getDateOfBirth) // 找出最大日期,利用LocalDate的自然排序 .max(Comparator.naturalOrder()) // 无符合条件记录时返回null,与原逻辑一致 .orElse(null); System.out.println(maxDate); } private static List<Person> getPersonList() { List<Person> persons = new ArrayList<>(); Person p1 = new Person(); p1.setDateOfBirth(LocalDate.now()); Person p2 = new Person(); p2.setDateOfBirth(LocalDate.of(2022, 9, 29)); Person p3 = new Person(); p3.setDateOfBirth(LocalDate.of(2022, 9, 12)); Person p4 = new Person(); p4.setDateOfBirth(LocalDate.of(2022, 10, 29)); persons.add(p1); persons.add(p2); persons.add(p3); persons.add(p4); return persons; } } class Person { LocalDate dateOfBirth; public LocalDate getDateOfBirth() { return dateOfBirth; } public void setDateOfBirth(LocalDate dateOfBirth) { this.dateOfBirth = dateOfBirth; } }
代码逻辑说明
- 过滤(filter):筛选出出生日期不晚于指定日期的Person对象,也可以用更直观的写法
p.getDateOfBirth().isBefore(myDob) || p.getDateOfBirth().isEqual(myDob),效果完全一致。 - 映射(map):将Person对象转换为对应的
LocalDate属性,聚焦到需要比较的核心数据上。 - 取最大值(max):借助
Comparator.naturalOrder()利用LocalDate自身的可比较特性,直接找出筛选后的最大日期,返回Optional<LocalDate>类型处理空值场景。 - 空值处理(orElse(null)):当没有符合条件的记录时返回null,和你原来的for-each逻辑保持统一;如果需要默认日期,可替换为
orElse(LocalDate.MIN)等自定义值。
内容的提问来源于stack exchange,提问作者Pushpak
相关产品推荐
相关产品推荐

