使用 Stream API 迭代 LocalDate

hsa*_*dik 0 java java-8 java-stream java-time

我有三个 LocalDate(最后 3 天),对于每个日期,我想循环并执行一些操作:

StringBuilder result = "";
for (LocalDate currentDate = LocalDate.now(); currentDate.isAfter(LocalDate.now().minusDays(3));  currentDate = currentDate.minusDays(1)){
     Page<User> users = userService.getAllUsersByRegistrationDate(currentDate);
     String reportTable = reportService.getReportTable(users, tableTemplate);
     result.append(reportTable);
}
Run Code Online (Sandbox Code Playgroud)

如何用 Stream API 替换此代码或提高可读性?

Ole*_*.V. 5

LocalDate.datesUntil(LocalDate, 期间)

\n

我发现你的代码很好,就我目前的情况。如果您想使用流操作,或者您\xe2\x80\x99只是好奇它的外观,从 Java 9 开始您可以这样做:

\n
    LocalDate today = LocalDate.now(ZoneId.of("Africa/Timbuktu"));\n    today.datesUntil(today.minusDays(3), Period.ofDays(-1))\n            .forEach(ld -> {\n                System.out.println("Now doing something with date " + ld);\n            });\n
Run Code Online (Sandbox Code Playgroud)\n

刚才运行时的输出:

\n
\n
Now doing something with date 2020-10-15\nNow doing something with date 2020-10-14\nNow doing something with date 2020-10-13\n
Run Code Online (Sandbox Code Playgroud)\n
\n

LocalDate.datesUntil()它\xe2\x80\x99s对于负周期的工作没有很好的记录,但它确实可以并返回一个LocalDate对象流。

\n

(我知道 lambda 中的大括号在这种情况下是不必要的,但从你的问题看来,你想为每个日期执行多个语句,因此它们当然是必要的。如果你只想要一个方法调用在那里,您可能只需要一行。. .forEach(ld -> System.out.println("Now doing something with date " + ld)))

\n

文档链接:LocalDate.datesUntil()

\n