- Я думал, что ваш собственный код был достаточно хорош для ответа.
- Я также думал, что предложение Бэзила Бурка о потоке было достаточно хорошим, чтобы его можно было изложить немного подробнее.
Ваш собственный ответ
Код, который вы разместили в комментарии, конечно, не читается.Здесь я отформатировал его (или мой Eclipse):
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
String sDate1 = "20181120";
LocalDate date1 = LocalDate.parse(sDate1, dtf);
LocalDate end = date1.plusYears(1);
ArrayList<String> first = new ArrayList<>();
ArrayList<String> second = new ArrayList<>();
ArrayList<String> third = new ArrayList<>();
while (!date1.isAfter(end)) {
first.add(dtf.format(date1) + "*_A.dat");
second.add(dtf.format(date1) + "_B.dat");
third.add(dtf.format(date1) + "__C.dat");
date1 = date1.plusDays(1);
}
// Let’s also see some of the result
first.forEach(System.out::println);
Вывод, сокращенно:
20181120*_A.dat
20181121*_A.dat
20181122*_A.dat
20181123*_A.dat
…
20191118*_A.dat
20191119*_A.dat
20191120*_A.dat
Подводя итог изменениям вопроса:
- Вам нужно было разобрать строку даты, чтобы получить дату начала.Однако для этого не было причин вносить хлопоты и устаревшие
SimpleDateFormat
.java.time предоставляет всю необходимую нам функциональность. - Поскольку нам нужна только дата, а не время суток, также не было причин использовать
LocalDateTime
. - Возможно, вы все еще намеревались
_*_
перед каждым из A
, B
и C
, но вы можете это исправить самостоятельно.
Использовать поток
List<String> first = date1.datesUntil(end.plusDays(1))
.map(d -> d.format(dtf) + "_*_A.dat")
.collect(Collectors.toList());
В этомВ этом случае я рекомендую три отдельных потоковых конвейера для трех списков.Так как метод datesUntil
принимает исключительную дату окончания, и вы хотите, чтобы ваша дата окончания была включена, нам нужно добавить 1 день.