【问题标题】:How to filter an array of objects by month and year - Java如何按月和年过滤对象数组 - Java
【发布时间】:2021-11-25 02:32:36
【问题描述】:

我是 Java 新手,我有一个问题。我有这个对象数组:

List<Expense> expenses = er.findAll();

包含这个:

我想知道如何按月和年过滤这个数组。

第一个示例是按 10 月和 2021 年过滤数组。

有什么建议吗?

【问题讨论】:

  • 好像你在做一个数据库调用,有什么具体原因没有在查询中过滤它吗?
  • 因为我不知道如何使用 MongoDB,所以我尝试了很多不同的方法,但都没有成功

标签: java arrays list object localdate


【解决方案1】:

作为@Avinds 正确答案的替代品,我建议使用java.time.YearMonth 来明确过滤的内容:

YearMonth ymFilter = YearMonth.of(2021,10);

List<Expense> result = expenses.stream()
                               .filter(ex -> YearMonth.from(ex.getDate()).equals(ymFilter))
                               .collect(Collectors.toList());

【讨论】:

  • 在大多数情况下,这将是我的首选解决方案。
【解决方案2】:

您可以使用Stream API 进行如下操作:

List<Expense> result = 
    expenses.stream()
            .filter(e -> e.getDate().getMonthValue() ==  10 && e.getDate().getYear() ==  2021)
            .collect(Collectors.toList());

或者,

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

我建议您使用第二种方式来避免 Expense#getDate 在每个步骤中被调用两次。

【讨论】:

    【解决方案3】:

    您可以像下面的示例一样使用 for-each 循环。

    int monthNumb = 10;
    for(expense ex : expenses) {
        if(ex.date == monthNumb) {
            /*behavior*/
        }
    }
    

    【讨论】:

    • 感谢您的贡献。这行不通。 (1) 你不能(安全地)将LocalDate 对象与== 进行比较。你需要.equals()。 (2) LocalDate 永远不会等于月份数,当然一个月中的所有天数都不会等于同一个月份数。请三思。
    猜你喜欢
    • 2018-11-23
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2020-03-22
    相关资源
    最近更新 更多