我有三个LocalDates (最后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);
}如何用Stream替换这些代码或提高可读性?
发布于 2020-10-15 13:08:15
Java 8解决方案
如果您真的坚持使用爪哇-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+解决方案
如果您使用爪哇-9或更高版本,您可以利用无限流的优势,并继续生成项目,直到满足特定条件。
三args Stream.iterate(T seed, Predicate hasNext, UnaryOperator 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 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-循环更易读。不要期望将循环“转换”为Stream自动增加可读性和简洁性。在很多情况下,情况并非如此。
发布于 2020-10-15 13:29:48
LocalDate.datesUntil(LocalDate,周期)
我觉得你的代码和我的一样好。如果您想要使用流操作,或者只是好奇您的外观如何,因为Java 9可以这样做:
LocalDate today = LocalDate.now(ZoneId.of("Africa/Timbuktu"));
today.datesUntil(today.minusDays(3), Period.ofDays(-1))
.forEach(ld -> {
System.out.println("Now doing something with date " + ld);
});刚才运行时输出:
现在用日期2020-10-15做某事,用2020年-10-14做某事,做2020年-10-13。
LocalDate.datesUntil()在负周期中工作的记录并不是很好,但它确实使用并返回了一个LocalDate对象流。
(我知道在这个例子中,花括号是没有必要的,但从你的问题来看,你似乎想为每个日期做一次以上的陈述,所以它们当然是必要的。如果您只想在那里调用一个方法,那么可能只需要一行。.forEach(ld -> System.out.println("Now doing something with date " + ld))。)
https://stackoverflow.com/questions/64372028
复制相似问题