新特性
1、本地变量类型推断
什么是局部变量类型估计?
var Java堆栈=' Java堆栈'; system.out.println (Java堆栈; 复制代码后可以看到,局部变量的类型估计是指左侧的类型直接使用var定义,而无需编写具体的类型。 编译器可以根据右表达式自动估计类型,如上面的String所示。
var Java堆栈=' Java堆栈'; 复制代码时:
字符串Java堆栈=' Java堆栈'; 代码2、字符串加强
Java 11添加了一系列字符串处理方法,包括:
//判断字符串是否为空白的' '.isBlank (; //true //首尾空格' Javastack '.strip (; //' Java堆栈'//删除结尾空格' Java堆栈'.strip trailing (; //' Java堆栈'//删除前导空格' Java堆栈'.strip leading (; //' Java堆栈'//复制字符串' Java'.repeat(3; //'JavaJavaJava' //行数统计' anbNC'.lines(.count ); //3代码3、集合加强
从Java 9开始,Jdk在集合(List/Set/Map )中添加了of和copyOf方法。 两者都创建不变的集合,看看它们的使用和区别。
示例1:
varlist=list.of('Java ',' Python ',' c ' ); varcopy=list.copyof(list ); system.out.println(list==copy; //true代码示例2:
var list=new ArrayListString (; varcopy=list.copyof(list ); system.out.println(list==copy; //false代码复制示例1和2中的代码是相同的,但为什么一个为true,一个为false呢?
让我们看看源代码:
staticelisteof(e.elements ) switch (elements.length )//implicitnullcheckofelementscase 0: returnimmutablecolllecolecascascase case 2: returnnewimmutablecollections.list 12 (elements [0],elements[1]; efault : returnnewimmutablecollections.listn (elements; }staticelistecopyof(collection? 扩展副本(returnimmutablecollections.list copy ) coll; } staticelistelistcopy (收集? extendsecoll(if ) collinstanceofabstractimmutablelistcoll.getclass )!=sublist.class({return(liste ) coll; }else{return(liste ) list.of (coll.to array ) ); }复制代码时,可以看到copyOf方法首先确定源集合是否为AbstractImmutableList类型,如果是,则直接返回,否则调用of创建新集合。
示例2使用new创建的集合不是不变的AbstractImmutableList类的子类,因此copyOf方法又创建了一个新实例,因此为false。
p>注意:使用 of 和 copyOf 创建的集合为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。
上面演示了 List 的 of 和 copyOf 方法,Set 和 Map 接口都有。
4、Stream 加强
Stream 是 Java 8 中的新特性,Java 9 开始对 Stream 增加了以下 4 个新方法。
增加单个参数构造方法,可为null Stream.ofNullable(null).count(); // 0 复制代码 增加 takeWhile 和 dropWhile 方法 Stream.of(1, 2, 3, 2, 1) .takeWhile(n -> n < 3) .collect(Collectors.toList()); // [1, 2] 复制代码从开始计算,当 n < 3 时就截止。
Stream.of(1, 2, 3, 2, 1) .dropWhile(n -> n < 3) .collect(Collectors.toList()); // [3, 2, 1] 复制代码这个和上面的相反,一旦 n < 3 不成立就开始计算。
3)iterate重载
这个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。
如果你对 JDK 8 中的 Stream 还不熟悉,可以看之前分享的这一系列教程。
5、Optional 加强
Opthonal 也增加了几个非常酷的方法,现在可以很方便的将一个 Optional 转换成一个 Stream, 或者当一个空 Optional 时给它一个替代的。
Optional.of("javastack").orElseThrow(); // javastack Optional.of("javastack").stream().count(); // 1 Optional.ofNullable(null) .or(() -> Optional.of("javastack")) .get(); // javastack 复制代码6、InputStream 加强
InputStream 终于有了一个非常有用的方法:transferTo,可以用来将数据直接传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法,如下示例。
var classLoader = ClassLoader.getSystemClassLoader(); var inputStream = classLoader.getResourceAsStream("javastack.txt"); var javastack = File.createTempFile("javastack2", "txt"); try (var outputStream = new FileOutputStream(javastack)) { inputStream.transferTo(outputStream); } 复制代码7、HTTP Client API
这是 Java 9 开始引入的一个处理 HTTP 请求的的孵化 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到这个 API。
来看一下 HTTP Client 的用法:
var request = HttpRequest.newBuilder() .uri(URI.create("https://javastack.cn")) .GET() .build(); var client = HttpClient.newHttpClient(); // 同步 HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body()); // 异步 client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println); 复制代码上面的 .GET() 可以省略,默认请求方式为 Get!
更多使用示例可以看这个 API,后续有机会再做演示。
现在 Java 自带了这个 HTTP Client API,我们以后还有必要用 Apache 的 HttpClient 工具包吗?
8、化繁为简,一个命令编译运行源代码
看下面的代码。
// 编译 javac Javastack.java // 运行 java Javastack 复制代码在我们的认知里面,要运行一个 Java 源代码必须先编译,再运行,两步执行动作。而在未来的 Java 11 版本中,通过一个 java 命令就直接搞定了,如以下所示。
java Javastack.java 复制代码更多新特性
新发布的Java 11在新特性方面,提供了17个JEP(JDK Enhancement Proposal 特性增强提议)
上图是Oracle公布的Java 11包含的所有新特性,其中几个重点的新特性为:
ZGC:可扩展的低延迟垃圾收集器
ZGC是一款号称可以保证每次GC的停顿时间不超过10MS的垃圾回收器,并且和当前的默认垃圾回收起G1相比,吞吐量下降不超过15%。
Epsilon:什么事也不做的垃圾回收器
Java 11还加入了一个比较特殊的垃圾回收器——Epsilon,该垃圾收集器被称为“no-op”收集器,将处理内存分配而不实施任何实际的内存回收机制。 也就是说,这是一款不做垃圾回收的垃圾回收器。这个垃圾回收器看起来并没什么用,主要可以用来进行性能测试、内存压力测试等,Epsilon GC可以作为度量其他垃圾回收器性能的对照组。大神Martijn说,Epsilon GC至少能够帮助理解GC的接口,有助于成就一个更加模块化的JVM。
增强var用法
Java 10中增加了本地变量类型推断的特性,可以使用var来定义局部变量。尽管这一特性被很多人诟病,但是并不影响Java继续增强他的用法,在Java 11中,var可以用来作为Lambda表达式的局部变量声明。
移除Java EE和CORBA模块
早在发布Java SE 9的时候,Java就表示过,会在未来版本中将Java EE和CORBA模块移除,而这样举动终于在Java 11中实施。终于去除了Java EE和CORBA模块。
HTTP客户端进一步升级
JDK 9 中就已对 HTTP Client API 进行标准化,然后通过JEP 110,在 JDK 10 中进行了更新。在本次的Java 11的更新列表中,由以JEP 321进行进一步升级。该API通过CompleteableFutures提供非阻塞请求和响应语义,可以联合使用以触发相应的动作。 JDK 11完全重写了该功能。现在,在用户层请求发布者和响应发布者与底层套接字之间追踪数据流更容易了,这降低了复杂性,并最大程度上提高了HTTP / 1和HTTP / 2之间的重用的可能性。
欢迎大家加入我的github项目 全栈工程师进阶学习站我个人的学习及生活小记录
行业内最新最群的报告,工作日每日更新