Я думаю, что-то вроде этого было задумано:
public List<String> subtractMonths(String[][] str) {
YearMonth lastMonth = YearMonth.now(clock).minusMonths(1);
List<String> ids = Arrays.stream(str)
.filter(pair -> YearMonth.parse(pair[1], DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.isBefore(lastMonth))
.map(pair -> pair[0])
.collect(Collectors.toList());
return ids;
}
Когда я вызываю этот метод сегодня и передаю ваш str
в качестве аргумента, я получаю такой результат:
[id1, id2, id3, id4]
Да, в дополнение к данному экземпляру Clock
я также использую классы YearMonth
и DateTimeFormatter
.Но YearMonth
получает время от часов.Это, в свою очередь, гарантирует поведение, которого они придерживались, когда требовали от вас использования часов.Они могут заменить другие часы, и код будет использовать эти часы исключительно для определения, в каком месяце мы находимся.
Это отлично подходит для тестируемости и часто используется для этой цели.Когда вы заменяете часы, которые всегда сообщают вам, что, скажем, январь 2019 года, вы знаете, каких результатов ожидать.Затем вы можете повторно запустить свои автоматизированные тесты в 2025 году и по-прежнему ожидать того же результата.И сообщайте о сбое, если вы его не получаете, и хорошо спите ночью, если вы это делаете.
Ссылка: Написание и тестирование удобных методов с использованием классов Java 8 Date / Time