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

Java中如何按月份和年份过滤对象数组

实现方案

首先默认你的Expense类存在日期相关属性,按不同存储场景分别处理:

场景1:Expense类已单独存储年份、月份字段

如果你的Expense类已经定义了Integer year、Integer month属性,直接用Stream API过滤即可,代码如下:

// 过滤2021年10月的数据,月份取值为1-12
List<Expense> oct2021Expenses = expenses.stream()
    .filter(expense -> expense.getYear() == 2021 && expense.getMonth() == 10)
    .toList();
// JDK 8不支持上面的toList()的话,替换为.collect(Collectors.toList())即可

场景2:Expense类存储的是Java 8+ LocalDate/LocalDateTime类型的日期字段

假设字段名为expenseDate,取年月判断即可:

import java.time.LocalDate;
import java.util.stream.Collectors;

List<Expense> oct2021Expenses = expenses.stream()
    .filter(expense -> {
        LocalDate date = expense.getExpenseDate();
        return date.getYear() == 2021 && date.getMonthValue() == 10;
    })
    .collect(Collectors.toList());

场景3:Expense类存储的是老版本java.util.Date类型的日期字段

需要用Calendar类解析年月,注意Calendar的月份取值为0-11,10月对应的常量是Calendar.OCTOBER或者数值9:

import java.util.Calendar;
import java.util.Date;
import java.util.stream.Collectors;

Calendar calendar = Calendar.getInstance();
List<Expense> oct2021Expenses = expenses.stream()
    .filter(expense -> {
        Date date = expense.getExpenseDate();
        calendar.setTime(date);
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        return year == 2021 && month == Calendar.OCTOBER;
    })
    .collect(Collectors.toList());

注意事项

  • 如果做通用过滤的话,可以把目标年、月封装成方法参数,不用硬编码
  • 注意不同日期API的月份取值范围,避免出现月份差1的逻辑错误
  • 如果数据量特别大(十万级以上),更建议在数据库查询层直接按年月过滤,不需要全量查出来再在内存里处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:18:04