首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历LocalDate

遍历LocalDate
EN

Stack Overflow用户
提问于 2020-10-15 12:52:33
回答 2查看 378关注 0票数 0

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

代码语言:javascript
复制
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替换这些代码或提高可读性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-15 13:08:15

Java 8解决方案

如果您真的坚持使用爪哇-8,那么您所能做的就是使用您想要过去的许多天的IntStream来创建一个LocalDate序列。然后mapToObj创建一个相关的LocalDate

代码语言:javascript
复制
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)

代码语言:javascript
复制
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)方法

代码语言:javascript
复制
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-152020-10-142020-10-13,并提供它们供通过Stream<LocalDate>进行进一步处理。

免责声明:我发现for-循环更易读。不要期望将循环“转换”为Stream自动增加可读性和简洁性。在很多情况下,情况并非如此。

票数 3
EN

Stack Overflow用户

发布于 2020-10-15 13:29:48

LocalDate.datesUntil(LocalDate,周期)

我觉得你的代码和我的一样好。如果您想要使用流操作,或者只是好奇您的外观如何,因为Java 9可以这样做:

代码语言:javascript
复制
    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))。)

文档链接:LocalDate.datesUntil()

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64372028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档