领先一步
VMware 提供培训和认证,助您加速进步。
了解更多我相信大多数读者都知道,Java SE 8 已于上月发布。与最近发布的 STS 3.5.0 及其对 JDK 8 的完整支持相结合,我们认为现在是升级 Sagan 以利用新语言特性和 API 的理想时机。
注意:还不熟悉 Sagan 项目?它是 Spring 的参考应用程序,为本博客和 spring.io 上的所有其他内容提供支持。请查看此系列中的第一、第二和第三篇帖子以获取更多详细信息。
Cloud Foundry 的 Java 构建包从发布之日起就提供了对 JDK 8 的支持。为了开始使用它,我们创建了自己的构建包分支,将 JDK 版本从 1.7.0 提升到 1.8.0,并配置了我们的 Gradle 构建,以便在将 Sagan 部署到生产环境时使用我们的分支。
注意:在不久的将来,1.8.0 将成为 Cloud Foundry 构建包的默认版本,届时所述的分支将不再必要。
正如您可能已经注意到的,Sagan 使用 Travis CI 进行持续集成和部署,而 更新我们的 Travis 配置以使用 JDK 8 非常简单。
当然,升级最有趣的方面是代码本身的更改。查看拉取请求 #348 中的提交,您会看到更改分为几个类别,包括使用 Lambda 表达式重构以及利用 JDK 8 强大的新 Stream API。
例如,对于一个非常简单的例子,从这样的代码
List<String> projectVersions = new ArrayList<>();
for (ProjectRelease projectRelease : project.getProjectReleases()) {
projectVersions.add(projectRelease.getVersion());
}
变成这样很棒。
List<String> projectVersions = project.getProjectReleases().stream()
.map(ProjectRelease::getVersion)
.collect(Collectors.toList());
或者,在单元测试中,从繁琐的
mockMvc.perform(createPostRequest)
.andExpect(new ResultMatcher() {
@Override
public void match(MvcResult result) {
String redirectedUrl = result.getResponse().getRedirectedUrl();
assertThat(redirectedUrl, startsWith("/admin/blog"));
}
});
到紧凑且易读的
mockMvc.perform(createPostRequest)
.andExpect(result -> {
String redirectedUrl = result.getResponse().getRedirectedUrl();
assertThat(redirectedUrl, startsWith("/admin/blog"));
});
当然,您在上面看到的只是 JDK 8 中流、Lambda 表达式和方法引用可能实现的功能的冰山一角。有几个新概念需要学习,但您会很高兴自己做到了!为此,我们推荐阅读 Venkat Subramanian 出色的《Java 中的函数式编程》。
我们还可以进行额外的更改,以充分利用 JDK 8 提供的功能,其中包括将我们的 java.util.Date、java.util.Calendar 和 java.util.TimeZone 的使用转换为 JDK 8 的新日期和时间 API。我们已经创建了问题 #360 来完成这项工作,如果您有兴趣提供帮助,我们很乐意与您一起处理拉取请求。只需查看贡献者指南,并在该问题中留言告诉我们您有兴趣。
无论如何,如果您一直好奇并想尝试 JDK 8 中的新功能和 API,我们希望您会发现 Sagan 应用程序的这些更改是一个有用的参考。
注意:如果您已经本地检出 Sagan 仓库,您需要重新生成您的 IDE 项目元数据,以确保您正在正确地使用 1.8 级别的语言功能。项目维基已更新,以反映正确的此操作要求和步骤。
此外,为了更全面地了解 JDK 8 在语言和 API 级别上可用的功能,请务必查看 Benjamin Winterberg 出色的Java 8 教程和Java SE 8 API 浏览器。
今年的 SpringOne 将于 9 月 8 日至 11 日在德克萨斯州达拉斯举行,超早鸟票现已开放注册。我们期待与您相见!