Java列表按日期过滤

时间:2018-08-31 06:32:14

标签: java javafx collections filter java-stream

我尝试在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());

        }
    }
}

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

2 个答案:

答案 0 :(得分:8)

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

但是,您正在使用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)));

答案 1 :(得分:1)

更改为:

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