Java新版特性企业级详解三(Java11)新特性

说明

2018年9月26日,Oracle官方发布JAVA11。这是JAVA大版本周期变化后的第一个长期支持版本,非常值得关注。最新发布的JAVA11将带来ZGC HttpClient等重要特性,一共17个需要我们关注的JEP,参考文档http://openjdk.java.net/projects/jdk/11/

翻译一下:

181:基于嵌套的访问控制

309:动态类文件常量

315:改进Aarch64 Intrinsics

318:Epsilon:一个无操作的垃圾收集器

320:移除Java EE和CORBA模块

321:HTTP客户端(标准)

323:本地变量语法Lambda参数

324:与Curve25519和Curve448的密钥一致

327:Unicode 10

328:飞行记录器

329:ChaCha20和Poly1305密码算法

330:启动单文件源代码程序

331:低开销堆分析

332:TLS (Transport Layer Security) 1.3

333:ZGC:一个可伸缩的低延迟垃圾收集器 (实验)

335:已弃用Nashorn JavaScript引擎

336:已弃用Pack200工具和API

Java11:局部变量类型推断升级

局部变量类型推断是java10开始新增的新特性,java11中对局部变量推断进行了升级,添加可以在var上添加注解的语法格式。

lambda表达式中,注解修饰变量的时候,变量的数据类型必须要写,不能省略,像下面这种写法就是错误的:

Consumer con =(@Deprecated  t) -> System.out.println(t.toLowerCase());

这个时候就必须要为小括号中的参数添加数据类型,应该这样写:

Consumer con =(@Deprecated String t) -> System.out.println(t.toLowerCase());

java11中,lambda表达式中的参数数据类型可以使用var,但是不能不写:

Consumer con =(@Deprecated var t) -> System.out.println(t.toLowerCase());

Java11:新增的String处理方法

描述

举例

判断字符串是否为空白

" ".isBlank(); // true

去除字符串首尾空白

" test ".strip(); // "test"

去除字符串尾部空格

" test ".stripTrailin(); // " www.mashibing.com"

去除字符串首部空格

" test ".stripLeading(); // "test "

复制字符串

"test".repeat(2);// "testtest"

行数统计

"A B C D".lines().count(); // 4

// 判断字符串是否为空白boolean b = " 	 ".isBlank();// true// 去除字符串首尾空白String s1 = " 
 	 test
 	  ".strip();// "test"// 去除字符串尾部空格String s2 = "  
 	test
 	  ".stripTrailing();// " 
 	test"// 去除字符串首部空格String s3 = "  
 	test
 	  ".stripLeading();// "test
 	 "// 复制字符串String r = "test".repeat(2);// "testtest"// 行数统计long c = "A
B
C
D".lines().count();// 4

注意:去除空格包括换行,制表符号。

Java11:Optional新增方法

Optional也增加了几个非常好用的方法,现在可以很方便的将一个Optional转换成一个Stream,或者当一个空Optional时,给它一个替代的。我们发现从JDK8开始出现Stream以后,Optional每个版本都有相关的更新。

新增方法

描述

新增版本

boolean isEmpty()

判断value是否为空

JDK11

T orElseThrow()

value非空,返回value
否则抛出NoSuchElementExpception

JDK10

ifPresentOrElse(Consumer<? super T> action,Runnable emptyAction)

value非空,执行参数1功能
如果value为空,执行参数2功能

JDK9

Optional or(Supplier<? extends Optional<? extends T> supplier)

value非空,返回对应的Optional
value为空,返回形参封装的Optional

JDK9

Stream stream();

value非空,返回一个仅包含此value的Steam
否则,返回一个空的Stream

JDK9

Optional optional =Optional.empty();//JDK8 判断value是否存在System.out.println(optional.isPresent());//JDK11 判断value是否为空System.out.println(optional.isEmpty());//JDK10 返回value,如果为null则直接抛出 NoSuchElementExpceptionOptional optional2 = Optional.of("element1");String value = optional2.orElseThrow();System.out.println(value);//JDK9  value非空,执行参数1功能,如果value为空,执行参数2功能Optional optional3 =Optional.empty();// Optional.of("element1");optional.ifPresentOrElse((v)-> System.out.println("value为"+v),()-> System.out.println("value为null"));// JDK9 value非空,返回对应的Optional,value为空,返回形参封装的OptionalOptional optional4 =Optional.empty();// Optional.of("element1");Optional optional5 = optional4.or(() -> Optional.of("element2"));System.out.println(optional5);// JDK9 value非空,返回一个仅包含此value的Steam,否则,返回一个空的StreamOptional optional6 =Optional.of("element3");//Optional.empty();Stream stream = optional6.stream();stream.forEach(System.out::println);

以上代码建议大家自己敲一遍,加深印象。

Java11:HTTPClient

JAVA9开始引入一个处理HTTP请求的HTTPClient API,该API支持同步和异步,而在JAVA11中成为正式可用状态,可以在java.net包中找到这个API,它将替代仅适用于bolocking模式的HTTPUrlConnection(创建于Http1.0s时代,并使用了协议无关的方法),并提供对WebSocket和HTTP2的支持。

同步方式

//HttpClient 替换原有的HttpUrlConnection  同步方式HttpClient client =HttpClient.newHttpClient();HttpRequest request =HttpRequest.newBuilder(URI.create("http://127.0.0.1:8080/demo")).build();HttpResponse.BodyHandler respnoseBodyHandler= HttpResponse.BodyHandlers.ofString();HttpResponse response =client.send(request,respnoseBodyHandler);String body = response.body();System.out.println(body);

异步方式:

//HttpClient 替换原有的HttpUrlConnection  异步方式HttpClient client =HttpClient.newHttpClient();HttpRequest request =HttpRequest.newBuilder(URI.create("http://127.0.0.1:8080/demo")).build();HttpResponse.BodyHandler respnoseBodyHandler= HttpResponse.BodyHandlers.ofString();CompletableFuture> sendAsync = client.sendAsync(request, respnoseBodyHandler);sendAsync.thenApply(t-> t.body()).thenAccept(System.out::println);

Java11:更简化的编译运行

JAVA11 提供了更简化的编译运行程序。

在我们目前的知识里面,运行一个java源代码必须经过两个步骤,一个是编译,一个是解释执行,而在java11中,通过一个java命令就可以直接搞定了,语法是:

java Test1.java

注意:

  1. 源代码文件中如果有多个类,执行源文件中的第一个类中主方法,注意这里的第一个是代码顺序的第一个,和是否由public修饰无关;
  2. 不可以使用其他源文件中定中自定义的类,当前文件中自定义的类是可以使用的。

定义一个源代码文件进行测试:

public class HelloJAVA11{    public static void main(String[] args){        System.out.println("HelloJAVA11.main");                // 实例化当前文件中的Person类        Person p=new Person();                // 实例化另一个文件中的Student类        Student stu =new Student();    }}class Person {    private String pid;    private String pname;}class Test2{    public static void main(String[] args){        System.out.println("Test2.main");    }}

运行一下:

Java11:废弃 Nashorn

废弃Nashorn javaScript引擎,在后续的版本中准备移除,需要的可以考虑 GraalVM。

Java11:ZGC

GC 是java的主要优势之一(另一个是强大的JVM),永远都是java优化的一个核心点。 然而,当GC的STW(stop the world)太长,就会影响应用的响应时间。消除或者减少GC的停顿时长,将会使JAVA对更广泛的使用场景成为一个更具有吸引力的平台。此外,现代系统中可用内存不断增长,用户和程序员希望JVM能够以更高效的方式利用这些内存,并且无需长时间STW。ZGC A Scalable Low-Latency Garbage Collector(Experimental),作为JDK11最瞩目的特征,但是后面带了Experimental,说明是实验版本,也就不建议在生产环境中使用。ZGC是一个并发,基于 region的压缩性垃圾收集器,只有root扫描阶段会STW,因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。

优势

  1. 暂停时间不会超过10ms;
  2. 既能处理几百兆的小堆,也能处理几个T的大堆(OMG);
  3. 和G1相比,应用吞吐能力不会下降超过15%;
  4. 为未来的GC功能和利用colord指针以及Load Barriers优化奠定基础;
  5. 初始只支持64位系统。

设计目标

  1. 支持TB级内存容量,暂停时间低(<10ms),对整个程序吞吐量的影响小于15%;
  2. 将来还可以扩展实现机制,用以支持很多让人兴奋的功能, 如多层堆或者压缩堆;多层堆即对象置于DRAM和冷对象置于NVMe闪存。

其他

以下这些变化,读者可以自行选择了解,因为在生成实践中接触不多,专业人士对这些特性不做过多讲解。

  1. unicode10
  2. Deprecate The Pack200 Tools and API
  3. 新的Epsilon垃圾收集器
  4. 完全支持Linux容器,包括Docker
  5. 支持G1上的并行完全垃圾收集
  6. 最新的HTTPS安全协议TLS 1.3
  7. JAVA Flight Recoder

Java专业人士 原创文章

请【关注】【点赞】【收藏】

如需转载,请回复说明

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章