让我的 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);
所以我的学校需要我们有一个分配的 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);