【问题标题】:Java List filter by dateJava List 按日期过滤
【发布时间】:2019-02-06 03:32:39
【问题描述】:

我尝试在FilteredList 中使用我的第一个过滤器,但它当然不起作用。

public class ListRemove {

    public static void main(String[] args) {

        ObservableList<CashBalance> cashBalanceList = FXCollections.observableArrayList();

        LocalDate f1 = LocalDate.of(2011, Month.JANUARY, 1);
        LocalDate f2 = LocalDate.of(2015, Month.AUGUST, 2);

        CashBalance c1 = new CashBalance();
        CashBalance c2 = new CashBalance();
        c1.setData(f1);
        c2.setData(f2);

        cashBalanceList.setAll(c1, c2);

        FilteredList<CashBalance> filteredList = new FilteredList<CashBalance>(cashBalanceList);

        filteredList.stream().filter(p -> p.getData().isAfter(LocalDate.of(2012, Month.JUNE, 2)))
                .collect(Collectors.toList());

        for (CashBalance l : filteredList) {

            System.out.println(l.getData());

        }
    }
}

应该显示一个日期,但显示两个。我做错了什么?

【问题讨论】:

  • CashBalance 看起来像?
  • filteredList.removeIf(…)?在我看来比使用流更简单。
  • 当然可以,但我正在学习过滤器和流:)

标签: java javafx collections filter java-stream


【解决方案1】:

改为:

filteredList = 
    filteredList
     .stream()
     .filter(
               p -> p.getData().isAfter(LocalDate.of(2012, Month.JUNE, 2))
    ).collect(Collectors.toList());

【讨论】:

  • 需要注意的是,这需要将filteredList的类型改为List虽然...
【解决方案2】:

您的方法不会过滤列表,而是将元素复制到新列表中,并过滤掉一些元素。这使原始内容保持不变。您需要将此新列表分配给一个变量才能使用它。

但是,您使用的是FilteredList 类,它提供了另一个列表的过滤视图。您可以使用setPredicate 方法设置过滤谓词

filteredList.setPredicate(p -> p.getData().isAfter(LocalDate.of(2012, Month.JUNE, 2)));

或者在构造函数中作为第二个参数

 FilteredList<CashBalance> filteredList = new FilteredList<CashBalance>(cashBalanceList, p -> p.getData().isAfter(LocalDate.of(2012, Month.JUNE, 2)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-08
    • 2019-03-01
    • 2016-01-10
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多