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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:48:22