65

5分钟学会Java 9~Java11的七大新特性

 6 years ago
source link: http://developer.51cto.com/art/201809/584465.htm?amp%3Butm_medium=referral
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.
neoserver,ios ssh client

QZvYVnn.gif

Java11 发布了,然而很多公司还在用Java 8 ,本文会简要介绍Java 9 -11 引入的新语法和API。

本地变量类型推断

Java 10 就已经引入了新关键词var,该关键词可以在声明局部变量的时候替换类型信息。本地(local)是指方法内的变量声明。

Java 10之前,你需要这样声明一个String对象。

fqyYRjq.jpg!web

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

eINFneq.jpg!web

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

NNZJB3n.jpg!web

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

JZbARjr.jpg!web

局部变量类型推断可以泛型。 在下一个示例中,Map

y6nmQbV.jpg!web

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

zaUjQvE.jpg!web

HTTP Client

Java 9开始引入HttpClient API来处理HTTP请求。 从Java 11开始,这个API正式进入标准库包(java.net)。 让我们来探索一下我们可以用这个API做些什么。

新的HttpClient可以同步或异步使用。 同步请求会阻止当前线程。 BodyHandlers定义响应体的预期类型(例如,字符串,字节数组或文件):

Qry6z2e.jpg!web

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

AVz63mI.jpg!web

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

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

BRFzQnI.jpg!web

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

MZreIf3.jpg!web

Collections

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

vEJ3umU.jpg!web

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

EJFNNzV.jpg!web

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

Nf2eiiv.jpg!web

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

Streams

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

2mMfauF.jpg!web

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

Zzaayqb.jpg!web

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

Optionals

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

q6Zvq2j.jpg!web

Strings

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

a6bENzV.jpg!web

InputStreams

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

6jERj2y.jpg!web

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

原文地址:

https://winterbe.com/posts/2018/09/24/java-11-tutorial/

【责任编辑:庞桂玉 TEL:(010)68476606】


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK