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
相关产品推荐
相关产品推荐

