Java 8 解决方案
如果您真的坚持使用java-8,您所能做的就是使用您想要过去的那几天的IntStream 创建LocalDate 的序列。然后mapToObj创建一个相关的LocalDate。
LocalDate currentDate = LocalDate.now();
String result = IntStream.range(0, 3)
.mapToObj(currentDate::minusDays)
.map(date -> {
Page<User> users = userService.getAllUsersByRegistrationDate(date);
return reportService.getReportTable(users, tableTemplate);
})
.collect(Collectors.joining());
Java 9+ 解决方案
如果您使用java-9或更高版本,您可以利用无限Stream的优势,不断生成项目,直到满足某个条件。
三参数 Stream.iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)
LocalDate threeDaysAgo = currentDate.minusDays(3);
String result = Stream.iterate(
LocalDate.now(),
date -> date.isAfter(threeDaysAgo),
date -> date.minusDays(1))
.map(date -> {
Page<User> users = userService.getAllUsersByRegistrationDate(date);
return reportService.getReportTable(users, tableTemplate);
})
.collect(Collectors.joining());
一种新方法 Stream::takeWhile(Predicate<? super T> predicate)
LocalDate threeDaysAgo = currentDate.minusDays(3);
String result = Stream.iterate(LocalDate.now(), date -> date.minusDays(1))
.takeWhile(date -> date.isAfter(threeDaysAgo))
.map(date -> {
Page<User> users = userService.getAllUsersByRegistrationDate(date);
return reportService.getReportTable(users, tableTemplate);
})
.collect(Collectors.joining());
以上所有示例都生成 3 个 LocalDate 实例,因为今天是 2020-10-15,它们将在过去 3 天内拥有:2020-10-15、2020-10-14、2020-10-13,并通过 Stream<LocalDate> 提供它们以供进一步处理.
免责声明:我发现 for 循环更具可读性。不要指望“转换”的 for 循环到 Stream API 会自动增加可读性和简洁性。在很多情况下,它不会。