2

5分钟学会Java9-Java11的七大新特性

 2 years ago
source link: http://yunxin.163.com/blog/fanyi-java-43/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
5分钟学会Java9-Java11的七大新特性 - 云信博客
> IM即时通信 > 5分钟学会Java9-Java11的七大新特性

%E5%9B%BE%E7%89%8711.png

现在Java有多元化的发展趋势,既有JS又有C++还有C#的影子,不学习那是不行滴。

来来来,花5分钟看看Java9-Java11的七大新特性,还有代码样例。

Java11 发布了,然而很多公司还在用Java 8 ,这里简单介绍一下 Java 9 -11 引入的新语法和API。

本地变量类型推断

Java 10 就已经引入了新关键词var,该关键词可以在声明局部变量的时候替换类型信息。本地(local)是指方法内的变量声明。 Java 10之前,你需要这样声明一个String对象。

%E5%9B%BE%E7%89%8712.png

在Java10里头可以使用var替代String,表达式变成这样:

%E5%9B%BE%E7%89%8713.png

用var声明的变量仍然是静态类型的。 不兼容的类型无法重新分配给此类变量。 此代码段无法编译:

%E5%9B%BE%E7%89%8714.png

当编译器无法推断出正确的变量类型时,也不允许使用var。 以下所有代码示例都会导致编译器错误:

%E5%9B%BE%E7%89%8715.png

局部变量类型推断可以泛型。 在下一个示例中,Map <String,List <Integer >>类型,可以将其简化为单个var关键字,从而避免大量样板代码:

%E5%9B%BE%E7%89%8716.png

从Java 11开始,lambda参数也允许使用var关键字:

%E5%9B%BE%E7%89%8717.png

HTTP Client

Java 9开始引入HttpClient API来处理HTTP请求。 从Java 11开始,这个API正式进入标准库包(http://java.net)。 让我们来探索一下我们可以用这个API做些什么。 新的HttpClient可以同步或异步使用。 同步请求会阻止当前线程。 BodyHandlers定义响应体的预期类型(例如,字符串,字节数组或文件):

%E5%9B%BE%E7%89%8718.png

也可以使用异步来执行相同的请求。 调用sendAsync不会阻止当前线程,而是返回CompletableFuture来进行异步操作。

%E5%9B%BE%E7%89%8719.png

我们可以省略.GET(),因为它是默认的请求方法。

下一个示例通过POST将数据发送到给定的URL。 与BodyHandler类似,您使用BodyPublishers定义作为请求主体发送的数据类型,如字符串,字节数组,文件或输入流:

%E5%9B%BE%E7%89%8720.png

最后一个例子演示了如何通过BASIC-AUTH执行授权:

%E5%9B%BE%E7%89%8721.png

Collections

List,Set和Map等集合已经用新方法扩展。 List.of从给定的参数创建了一个新的不可变列表。 List.copyOf创建列表的不可变副本。

%E5%9B%BE%E7%89%8722.png

因为list已经是不可变的,所以实际上不需要实际创建list实例的副本,因此list和副本是相同的实例。 但是,如果你复制一个可变list,那么复制确实会生成一个新实例,因此保证在改变原始list时没有副作用:

%E5%9B%BE%E7%89%8723.png

创建不可变map时,您不必自己创建map条目,而是将键和值作为参数传递:

%E5%9B%BE%E7%89%8724.png

Java 11中的不可变集合仍然使用Collection API中的老接口。 但是,如果尝试修改不可变集合,则会抛出java.lang.UnsupportedOperationException。 可喜的是,如果尝试改变不可变集合,Intellij IDEA会通过发出警告

Streams

Streams是在Java 8中引入的,Java 9增加了三个新方法。 单个参数构造方法:

%E5%9B%BE%E7%89%8725.png

增加 takeWhile 和 dropWhile 方法,用于从stream中释放元素:

%E5%9B%BE%E7%89%8726.png

如果对Stream不熟,可以参考这篇文章[1]。

Optionals

Optionals提供了一些非常方便的功能,例如 您现在可以简单地将Optional转换为Stream,或者为空Optinal提供另一个Optional作为备胎:

%E5%9B%BE%E7%89%8727.png

Strings

Java11 给String增加了一些辅助方法来修剪或检查空格等功能:

%E5%9B%BE%E7%89%8728.png

InputStreams

InputStream增加了transferTo方法,可以用来将数据直接传输到 OutputStream:

%E5%9B%BE%E7%89%8729.png

其他的一些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的文章。

想要阅读更多技术干货文章,欢迎关注网易云信博客

了解网易云信,来自网易核心架构的通信与视频云服务。


网易云信(NeteaseYunXin)是集网易18年IM以及音视频技术打造的PaaS服务产品,来自网易核心技术架构的通信与视频云服务,稳定易用且功能全面,致力于提供全球领先的技术能力和场景化解决方案。开发者通过集成客户端SDK和云端OPEN API,即可快速实现包含IM、音视频通话、直播、点播、互动白板、短信等功能


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK