您的位置 首页 java

快从Java8升级到11,享受这些功能

在面临Java8维护即将到期的时候,提升你的系统到下一个LTS(长期维护版本)的JDK是刻不容缓的事,那么哪些 java 11的功能,可以直接用在我们开发中,有效提高工作效率或者提供代码质量呢?

快从Java8升级到11,享受这些功能

内置HttpClient来改进的HTTP通信

在微服务和服务 API 的世界中,HTTP通信是不可避免的。通常需要编写代码来调用端点以检索或修改数据。HttpURLConnection是用于HTTP通信的API,已经存在了很长时间,已经不能满足现下的需求。通常我们都会使用apache httpclient或者okhttp,这些支持HTTP2和WebSocket的第三方库来处理。

Oracle意识到Java功能集的这一缺点,并在Java 9中将HttpClient实现作为实验性功能引入。HttpClient已经成长为Java 11的最终功能。

如果需要第一个升级到Java11的理由,就是这个!不需要再额外依赖第三方库。

Code example

不编译启动单文件程序

Java不是脚本语言。对于要执行的每个程序,首先需要通过显式运行javac命令来对其进行编译。通过这种往返操作,尝试测试一些小代码段变得不太方便。Java 11改变了这一点。

现在,您可以执行单个文件中包含的Java源代码,而无需先对其进行编译。

要执行该命令,请使用Java 11运行java命令。Java将动态编译 源文件 ,并使用classpath中的 class文件 运行程序。

在不编译的情况下启动单个文件程序非常方便,但是您需要注意一些限制。使用Java 11,程序不能使用java.base模块以外的任何外部依赖项。此外,您只能启动一个文件程序。当前不支持从其他Java源文件调用方法,但是如果需要,您可以在同一文件中定义多个类。我个人认为此功能是快速制作原型的有用工具。

String, Collection, File 都增加新的API

一般来说,guava, apache commons已经要变成必要库,因为每个项目都有他们。Java11在学习,尝试添加了类似的新的API方法。

  • String.repeat(Integer)
  • String.isBlank()
  • String.strip()
  • String.lines()

集合API

以前,collection -> array,比较复杂,需要先new array,要求提供类型和大小。

Java11 提供了 Collections.toArray(IntFunction<T []>), 传递函数而不是数组实例了。

File API

这也是一个很依赖外部库来实现一些通用性的代码,否则就会拷贝很多。这肯定是任何开发要避免的,很难维护。

Java11 提供了Files.readString(Path), Files.writeString(Path, CharSequence, OpenOption)方法,简化了读写。

增强的Option和Predicate

在Java8添加Option之后,我经常会使用它来避免nullcheck或者NPE。

Java11添加了isEmpty()而不是再用isPresent()来取反判断的方式。

而Predicate则可以直接用在stream中

 @Test
void canUsePredicateNotAsFilter() {
        List<String> months = List.of(" January ", "February", " March ");
List<String> filteredMonths = months .stream()
        .filter(Predicate.not(month > month.startsWith("M")))
        .collect(Collectors.toList()); assertEquals(List.of("January", "February"), filteredMonths);
        }  

在lamba中使用 var

Java10开始,Java支持使用var,虽然还是编译期类型推断,但已经相对方便了。

Java11中,var可以用在lamba中,好处是 可以给变量加annotation 。下面的代码加了@NotNull

 @Test
void canUseVarForLambdaParameters(){
        List<String> months=List.of("January","February","March");List<String> filteredMonths=months
        .stream()
        .filter(Predicate.not((@NotNull var month) >
        month.startsWith("M"))).collect(Collectors.toList());
        assertEquals(List.of("January","February"),filteredMonths);
}  

采用了Unicode10编码

Java 10使用Unicode 8标准进行本地化。Unicode标准不断发展,因此大约是Java 11遵循最新版本Unicode 10的时候了。

从Unicode 8升级到10包括16018个新字符和10个新脚本。脚本是用来表示文本信息的字母和其他书面符号的集合。

基于嵌套类的访问控制

嵌套类也是我们开发中常用的手段,比如有个Outer.java中包含Inner class,那么Inner.class可以访问Outer.class的所有private字段和方法。

事实上Java会给Inner.class建一个Outer$Inner.class文件。然后在compile过程中创建扩展类访问的accessibility­broadening bridge。

Java11消除了这个bad smell。无需额外的compile工作就可以达到上面的目的。

那对开发的影响是什么?以前如果需要设置可访问性为true,才能从外部类用反射访问字段。现在不需要了。

使用Java Flight Recorder来记录OS event和JVM event

Java Flight Recorder(JFR)是用于分析正在运行的Java应用程序并捕获诊断以进行进一步分析的工具。该工具不是Java的新功能。它是Java 7的一部分,但被认为是一项商业功能,需要通过使用下面的选项开启

JVMoptions -XX:+UnlockCommercialFeatures ­XX:+FlightRecorder.

在Java 11中,JFR成为开源软件,并包含在OpenJDK中。毫无疑问这将帮助我们更好的debug可能出现的程序问题。

现在感觉如何?是不是迫不及待要升级了?

文章来源:智云一二三科技

文章标题:快从Java8升级到11,享受这些功能

文章地址:https://www.zhihuclub.com/178495.shtml

关于作者: 智云科技

热门文章

网站地图