Java11 发布了, 然而很多公司还在用 Java 8 , 本文会简要介绍 Java 9 -11 引入的新语法和 API.
本地变量类型推断
Java 10 就已经引入了新关键词 var, 该关键词可以在声明局部变量的时候替换类型信息. 本地 (local) 是指方法内的变量声明.
Java 10 之前, 你需要这样声明一个 String 对象.
在 Java10 里头可以使用 var 替代 String, 表达式变成这样:
用 var 声明的变量仍然是静态类型的. 不兼容的类型无法重新分配给此类变量. 此代码段无法编译:
当编译器无法推断出正确的变量类型时, 也不允许使用 var. 以下所有代码示例都会导致编译器错误:
局部变量类型推断可以泛型. 在下一个示例中, Map
从 Java 11 开始, lambda 参数也允许使用 var 关键字:
HTTP Client
Java 9 开始引入 HttpClient API 来处理 HTTP 请求. 从 Java 11 开始, 这个 API 正式进入标准库包(java.NET). 让我们来探索一下我们可以用这个 API 做些什么.
新的 HttpClient 可以同步或异步使用. 同步请求会阻止当前线程. BodyHandlers 定义响应体的预期类型(例如, 字符串, 字节数组或文件):
也可以使用异步来执行相同的请求. 调用 sendAsync 不会阻止当前线程, 而是返回 CompletableFuture 来进行异步操作.
我们可以省略. GET, 因为它是默认的请求方法.
下一个示例通过 POST 将数据发送到给定的 URL. 与 BodyHandler 类似, 您使用 BodyPublishers 定义作为请求主体发送的数据类型, 如字符串, 字节数组, 文件或输入流:
最后一个例子演示了如何通过 BASIC-AUTH 执行授权:
Collections
List,Set 和 Map 等集合已经用新方法扩展. List.of 从给定的参数创建了一个新的不可变列表. List.copyOf 创建列表的不可变副本.
因为 list 已经是不可变的, 所以实际上不需要实际创建 list 实例的副本, 因此 list 和副本是相同的实例. 但是, 如果你复制一个可变 list, 那么复制确实会生成一个新实例, 因此保证在改变原始 list 时没有副作用:
创建不可变 map 时, 您不必自己创建 map 条目, 而是将键和值作为参数传递:
Java 11 中的不可变集合仍然使用 Collection API 中的老接口. 但是, 如果尝试修改不可变集合, 则会抛出 java.lang.UnsupportedOperationException. 可喜的是, 如果尝试改变不可变集合, Intellij IDEA 会通过发出警告.
Streams
Streams 是在 Java 8 中引入的, Java 9 增加了三个新方法. 单个参数构造方法:
增加 takeWhile 和 dropWhile 方法, 用于从 stream 中释放元素:
如果对 Stream 不熟, 可以参考这篇文章[1].
Optionals
Optionals 提供了一些非常方便的功能, 例如 您现在可以简单地将 Optional 转换为 Stream, 或者为空 Optinal 提供另一个 Optional 作为备胎:
Strings
Java11 给 String 增加了一些辅助方法来修剪或检查空格等功能:
InputStreams
InputStream 增加了 transferTo 方法, 可以用来将数据直接传输到 OutputStream:
其他的一些 VM 特性
从 Java 8 到 Java 11 引入了很多新特性, 以下是这些特性的列表:
- Flow API for reactive programming
- Java Module System
- Application Class Data Sharing
- Dynamic Class-File Constants
- Java REPL (JShell)
- Flight Recorder
- Unicode 10
- G1: Full Parallel Garbage Collector
- ZGC: Scalable Low-Latency Garbage Collector
- Epsilon: No-Op Garbage Collector
- Deprecate the Nashorn JavaScript Engine
译者注: 对于译者来说还是 Application Class-Data Sharing(CDS),ZGC 和 Flight Recorder 比较有吸引力一点. 关于 ZGC, 可以参考前段时间高可用架构关于 ZGC 的文章.
来源: http://www.tuicool.com/articles/7RviMff