让我的 lambda 输出仅包含与当前月份匹配的值的过滤列表

getting my lambda to output a filtered list containing only values that match the current month

所以我的学校需要我们有一个分配的 lambda 表达式,所以我决定对过滤列表进行 lambda 运算可能更容易问题是,无论我做什么,下面的代码都会给我接下来的 30 天下面只是我正在尝试的一个例子,但我需要一种方法来查看是否有可能获得此代码:

        ObservableList<Appointments> appts = AppointmentsDAO.getAppts();
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime month = now.plusMonths(1);

        
        FilteredList<Appointments> filter = new FilteredList<>(appts);
        filter.setPredicate(row -> {
            LocalDateTime start = (row.getStartTime().toLocalDateTime());
            return start.isAfter(now) && start.isBefore(month);
        });

        appointmentsTableView.setItems(filter);

输出与我之前使用的 sql 语句相同的内容:

SELECT *
from appointments AS a
  INNER JOIN contacts AS c ON a.Contact_ID=c.Contact_ID
WHERE MONTH(start) = MONTH(NOW()) AND YEAR(start) = YEAR(NOW());

sql 语句为我提供了所有匹配的月-年信息的筛选数据库列表,但我如何为 java 翻译相同的语句?我想也许我不能,但认为值得一试。此外,在我的程序中,点亮的行 im 过滤设置为时间戳,但到目前为止,将时间戳转换为 localDateTime 并不是一个问题,尽管可能与此相关。

你的 lambda 看起来不错。我认为你的问题是日期逻辑。您要求过滤当前日期时间和下个月同一天之间的行。您想要过滤当月月初和当月末之间的行。因此,需要注意的是此代码未经过测试,如下所示:

ObservableList<Appointments> appts = AppointmentsDAO.getAppts();
LocalDateTime now = LocalDateTime.now();
LocalDateTime startOfMonth = now.with(firstDayOfMonth());
LocalDateTime endOfMonth = now.with(lastDayOfMonth());

FilteredList<Appointments> filter = new FilteredList<>(appts);
filter.setPredicate(row -> {
    LocalDateTime start = (row.getStartTime().toLocalDateTime());
    // This next line fails for records falling exactly on the start/end of month...
    // return start.isAfter(startOfMonth) && start.isBefore(endOfMonth);
    // ... this version should do better in that regard
    if ( startOfMonth.isAfter(start) || endOfMonth.isBefore(start) ) {
      return false;
    }
    return true;
});



appointmentsTableView.setItems(filter);