Oracle 在2017年3月底左右发布了Java新版本:Java SE9。Java 9 作为一个重要的发布版本为我们开发者带来了非常多的新特性。因此,后期我会陆续发表一系列有关Java SE 9新功能的文章。今天借用这篇文章作为大纲,带着大家一起来总览一下 Java 9 提供的新特性。
关于 Java 10 的新特性,请参阅Java 10 新特性深入详解这篇文章。
Java 9 REPL (JShell)
Oracle 公司推出了一种名为jshell
的新工具 REPL (Read Evaluate Print Loop)。 我们可以称之为 Java Shell。 用它可以非常容易地执行和测试任何Java 代码,如类,接口,枚举,对象,语句等。
我们可以从https://jdk9.java.net/download/下载JDK 9 EA软件。
G:\>jshell
| Welcome to JShell -- Version 9-ea
| For an introduction type: /help intro
jshell> int a = 10
a ==> 10
jshell> System.out.println("a value = " + a )
a value = 10
如果您想进一步了解REPL工具,请阅读Java 9:REPL功能一和Java 9:REPL功能二。
Immutable Collection Factory
Oracle 引入了一系列便捷的工厂方法来创建不可变List
,Set
,Map
和Map.Entry
等对象。这些实用的工厂方法方便我们创建空或非空的Collection对象。
在Java SE 8以及更早版本中,我们可以使用诸如unmodifiableXXX之类的集合类提供的方法来创建Immutable Collection对象。例如,如果我们要创建一个不可变List,则可以使用Collections.unmodifiableList方法。
但是,这些Collections.unmodifiableXXX方法是一种繁琐而冗长的。为了克服这些缺点,Oracle向List
,Set
和Map
接口添加了一些实用的便捷方法。
List和Set接口使用 of()
方法来创建一个空的或非空的不可变List或Set对象,如下所示:
空List示例
List immutableList = List.of();
非空List示例
List immutableList = List.of("one","two","three");
Map有两组方法:of()
方法和ofEntries()
方法,分别用于创建Immutable Map对象和Immutable Map.Entry对象。
空Map示例
jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}
非空Map示例
jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}
如果您想了解有关这些实用方法的更多信息,请参阅以下文章:
Private methods in Interfaces
在Java SE 8中,我们可以在接口里使用Default和Static方法。 但是,我们不能在接口中创建Private方法。
为了避免代码冗余和提高代码的可重用性,Oracle在Java SE 9接口中引入私有方法。 从Java SE 9开始,我们也可以使用private
关键字在接口中编写私有方法和私有静态方法。
这些私有方法类似于其他类的私有方法,它们之间没有区别。
public interface Card{
private Long createCardID(){
// Method implementation goes here.
}
private static void displayCardDetails(){
// Method implementation goes here.
}
}
如果您想了解更多有关此新功能的信息,请访问以下链接:
Java 9:接口中的私有方法
Java 9 模块系统
模块系统是Java 9最大的一次变化。 Oracle公司在Jigsaw Project引入以下功能:
- 模块化JDK
- 模块化Java源代码
- 模块化运行时映像
- 封装Java内部API
- Java平台模块系统
在Java SE 9版本之前,我们使用Monolithic Jars开发基于Java的应用程序。这种体系结构有很多局限性和缺点。为避免所有这些缺点,Java SE 9引入了模块。
JDK 9随附92个模块(后续版本中可能会更改)。我们可以使用JDK本身自带的模块,也可以创建自己的模块,如下所示:
module com.foo.bar { }
在这里,我们使用module
来创建一个简单的模块。每个模块都有一个名称相关代码和其他资源。
要扩展阅读此新特性的更多详细信息,请参考下面罗列出来的3篇文章:
改进进程API
Java SE 9在Process API中进行了一些改进。他们添加了一些新的类和方法来简化OS进程的控制和管理。
在Java SE 9 中提供了2个新的类:
- java.lang.ProcessHandle
- java.lang.ProcessHandle.Info
示例代码:
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Current Process Id: = " + currentProcess.getPid());
改进 Try With Resource
我们知道,Java SE 7引入了一种新的异常处理结构:Try-With-Resources
以自动管理资源。
Java SE 9对该语句进行一些改进,以避免迪马的冗长和提高可读性。
Java 7 示例:
void testARM_Before_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (BufferedReader reader2 = reader1) {
System.out.println(reader2.readLine());
}
}
Java 9 示例:
void testARM_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (reader1) {
System.out.println(reader1.readLine());
}
}
要阅读有关此新功能的更多信息,请浏览我的扩展教程: Java 9:Try-With-Resources 的改进
CompletableFuture API
在Java SE 9中,Oracle 改进了CompletableFuture API以解决Java SE 8中提出的一些问题。添加一些实用的方法以支持延迟和超时操作以及如何更好的子类化。
Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
这里的delayExecutor()
是一个静态方法,用于返回新的Executor
,该Executor
在给定的延迟后将任务提交给默认的执行程序。
响应式流
如今,响应式编程由于它的诸多好处在开发中变的越来越流行,比如:Scala,Play,Akka等等一些语言/框架都用到了Reactive Streams
。 同样,Oracle在Java SE 9中也引入了新的Reactive Streams API。
Java SE 9 Reactive Streams API是一个发布/订阅框架,使得Java语言能够非常轻松地实现异步,可伸缩和并行操作。
Java SE 9引入了以下API,以在基于Java的应用程序中开发响应流。
- java.util.concurrent.Flow
- java.util.concurrent.Flow.Publisher
- java.util.concurrent.Flow.Subscriber
- java.util.concurrent.Flow.Processor
关于Reactive Streams
的更多详细信息请参考我的另外一篇文章Java 9:响应式流操作
改进 Optional 类
在Java SE 9中,Oracle 向java.util.Optional类添加了一些有用的新方法。 在这里,我将通过一些简单的示例来讨论其中一种方法:流方法
如果给定的Optional
对象中存在一个值,则此stream()
方将返回一个具有该值的顺序Stream,否则它将返回一个空Stream。
如下示例展示了添加stream()
方法来延迟对可选对象:
Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)
这里的Optional.stream()
用于将Employee的Optional的Stream对象转换为Employee的Stream,以便我们可以在结果代码中延迟处理此结果。
如果您需要通过更多示例了解Optional功能和更多关于添加到Optional类的新方法,请参阅我的扩展教程:Java 9:Optional 类的改进
流API的改进
在Java SE 9中,Oracle 向java.util.Stream
接口添加了四个有用的新方法。因为Stream是接口,所以所有这些新实现的方法都是默认方法。其中有两个非常重要的方法:dropWhile()
和takeWhile()
。
如果您熟悉Scala语言或任何Function编程语言,则一定会对这些方法有所了解。这些是编写某些功能代码的非常有用的方法。让我们在这里讨论一下takeWhile()
方法。
该takeWhile()
将谓词(predicate
)作为参数,并返回给定Stream值的子集Stream,直到该谓词第一次返回false为止。 如果第一个值不满足该谓词,则仅返回一个空Stream。
jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 )
.forEach(System.out::println);
1
2
3
4
要阅读有关takeWhile()
和dropWhile()
方法以及其他新方法的更多信息,请我的扩展教程:Java 9:Stream API的改进
对@Deprecated 注解的增强
在Java SE 8和更早版本中,@Deprecated注解只是一个Marker接口,没有任何方法。 它用于标记Java API的类,字段,方法,接口,构造函数,枚举等。
在Java SE 9中,Oracle 增强了@Deprecated
注解,以提供给相关已弃用的API的更多信息,并提供一种工具来分析应用程序对已弃用的API的使用情况。 该注解为已废弃的接口添加了两种方法:forRemoval和since。
HTTP 2 客户端
在Java SE 9中,Oracle 发布了新的HTTP 2 Client API,以支持HTTP / 2协议和WebSocket功能。 由于现有的或旧式的HTTP客户端API存在许多问题(例如只支持HTTP / 1.1协议,并不支持HTTP / 2协议和WebSocket,仅在阻塞模式下工作,并且存在很多性能问题。),Oracle将HttpURLConnection
API替换为新的HTTP Client。
Oracle在java.net.http
包下引入一个新的HTTP 2客户端API。 它同时支持HTTP / 1.1和HTTP / 2协议。 同时支持同步(阻止模式)和异步模式。 而且使用WebSocket API来支持异步模式。
我们可以在https://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html上看到新的API。
HTTP 2 Client 示例
jshell> import java.net.http.*
jshell> import static java.net.http.HttpRequest.*
jshell> import static java.net.http.HttpResponse.*
jshell> URI uri = new URI("https://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> https://rams4java.blogspot.co.uk/2016/05/java-news.html
jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
response ==> java.net.http.HttpResponseImpl@79efed2d
jshell> System.out.println("Response was " + response.body(asString()))
请参阅我的扩展教程:Java SE 9:HTTP 2 Client,以了解HTTP / 2协议和WebSocket,新API的优点以及老 API的缺点,并提供了一些有用的示例。
多分辨率图像API
在Java SE 9中,Oracle 引入了一个新的Multi-Resolution Image API。 此API中的重要接口是MultiResolutionImage
。 你可以在java.awt.image
包中看到它。
MultiResolutionImage
封装了一组具有不同高度和宽度(即不同分辨率)的图像,并允许我们根据需求查询它们。
其它的一些Java 9 特性
在该部分中,我只是列出一些Java SE 9的其他新功能。 这并不是说这些功能不是那么重要。 通过一些有用的示例,它们对于理解它们也非常重要和有用。
截至目前,我还没有足够的时间来扩展讲解这些特性。 后续我将逐一介绍这些功能,并通过简短的讨论和示例将其添加到上面部分中。 后期再单独详细写各自的功能。
- GC (Garbage Collector) Improvements
- Stack-Walking API
- Filter Incoming Serialization Data
- Deprecate the Applet API
- Indify String Concatenation
- Enhanced Method Handles
- Java Platform Logging API and Service
- Compact Strings
- Parser API for Nashorn
- Javadoc Search
- HTML5 Javadoc
后续我将逐一介绍这些Java 9的功能,并用更多的描述和示例来更新它们。
即以此文献给那些Java爱好者们,欢迎大家围观。
原文链接:https://www.journaldev.com/13121/java-9-features-with-examples