Java 9是一个主要的版本,它为开发人员带来了很多功能,在本文中,我们将仔细研究Java 9的功能。
Java 10 已发布,如需对 Java 10 发布的完整概述,请浏览 [Java 10 功能](/社区/教程/java-10 功能)。
Java 9 功能
Some of the important java 9 features are;
- Java 9 REPL (JShell)
- 工厂方法不变列表,设置,地图和地图。输入
- 私人方法在接口中改进
- Java 9模块系统改进)
- 进程API改进
- 试用资源改进(# )7. CompletableFuture API 改进8. [Reactive Streams]#Reactive
Oracle Corporation 将于 2017 年 3 月底发布 Java SE 9。
Java 9 REPL (JShell) 版本
Oracle Corp 引入了一种名为jshell
的新工具,它代表了 Java Shell,也被称为 REPL(Read Evaluate Print Loop)。它用于执行和测试任何类型,界面,enum,对象,陈述等的 Java 构造。我们可以从 https://jdk9.java.net/download/下载 JDK 9 EA (早期访问) 软件。
1G:\>jshell
2| Welcome to JShell -- Version 9-ea
3| For an introduction type: /help intro
4
5jshell> int a = 10
6a ==> 10
7
8jshell> System.out.println("a value = " + a )
9a value = 10
如果您想了解更多关于 REPL 工具的信息,请通过 Java 9 REPL 基本(第 1 部分)和 Java 9 REPL 功能(第 2 部分)。
不变列表、设置、地图和地图的工厂方法
奥拉克尔公司已经引入了一些方便的工厂方法来创建不可变列表、设置、地图和Map.Entry对象。这些实用方法被用来创建空的或非空的收藏对象。在Java SE 8和早期版本中,我们可以使用集合类实用方法,如unmodifiableXXX
来创建不可变列表对象。例如,如果我们想要创建不可变列表,那么我们可以使用Collections.unmodifiableList
方法。然而,这些Collections.unmodifiableXXX
方法是一种无聊的和可言的方法。为了克服这些缺陷,奥拉克尔公司已将一些实用方法添加到列表、设置和地图接口中。列表和设置接口有创建空的或无空不可
1List immutableList = List.of();
非空名单示例
1List immutableList = List.of("one","two","three");
地图有两套方法: of()
方法和 ofEntries()
方法,分别创建不可变地图对象和不可变地图入口对象。
1jshell> Map emptyImmutableMap = Map.of()
2emptyImmutableMap ==> {}
非空地图示例
1jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
2nonemptyImmutableMap ==> {2=two, 3=three, 1=one}
如果您想了解更多有关这些实用方法的信息,请通过以下链接阅读:
- Java 9 Factory Methods for Immutable List
- Java 9 Factory Methods for Immutable Set
- Java 9 Factory Methods for Immutable Map and Map.Entry
接口中的私人方法
在Java 8中,我们可以使用默认和静态方法在接口中提供方法实现,但是我们不能在接口中创建私有方法,为了避免代码过剩和更多可重复使用,Oracle Corp将在Java SE 9接口中引入私有方法,从Java SE 9开始,我们也可以使用私有
关键字在接口中写私有和私有静态方法。
1public interface Card{
2
3 private Long createCardID(){
4 // Method implementation goes here.
5 }
6
7 private static void displayCardDetails(){
8 // Method implementation goes here.
9 }
10
11}
如果您想了解更多关于这项新功能的信息,请点击以下链接: Java 9 接口中的私人方法。
Java 9 模块系统
其中一个大变化或 java 9 功能是模块系统,Oracle 公司将作为 Jigsaw 项目的一部分引入以下功能。
*模块化JDK *模块化Java源代码 *模块化运行时图像 *嵌入Java内部API *Java平台模块系统
在 Java SE 9 版本之前,我们正在使用 Monolithic Jars 来开发基于 Java 的应用程序. 这个架构有很多限制和缺点. 为了避免所有这些缺点,Java SE 9 配备了模块系统。 JDK 9 配备了 92 个模块(最终发布时可能会发生变化)。
1module com.foo.bar { }
在这里,我们正在使用模块
来创建一个简单的模块. 每个模块都有一个名称,相关代码和其他资源. 有关这个新的架构和实践经验的更多细节,请参阅我的原始教程在这里:
流程 API 改进
Java SE 9 带来了进程 API 的一些改进,他们增加了几种新类和方法,以便简化操作系统流程的控制和管理。
- java.lang.ProcessHandle
- java.lang.ProcessHandle.Info
** 流程 API 示例**
1ProcessHandle currentProcess = ProcessHandle.current();
2 System.out.println("Current Process Id: = " + currentProcess.getPid());
尝试改善资源
我們知道,Java SE 7 引入了一個新的例外處理構造:試用資源自動管理資源. 這個新聲明的主要目標是自動更好的資源管理
。Java SE 9 將為此聲明提供一些改進,以避免更多說話,並改善一些可讀性。
1void testARM_Before_Java9() throws IOException{
2 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
3 try (BufferedReader reader2 = reader1) {
4 System.out.println(reader2.readLine());
5 }
6}
Java 9 例子
1void testARM_Java9() throws IOException{
2 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
3 try (reader1) {
4 System.out.println(reader1.readLine());
5 }
6}
要了解更多关于这项新功能的信息,请访问我的原始教程: Java 9 Try-With-Resources-Improvements
未来的API改进
在Java SE 9中,Oracle Corp将改进CompletableFuture API,以解决Java SE 8中提出的一些问题。
1Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
在这里,delayedExecutor()是一个用于返回一个新的Executor的静态实用方法,该方法在给定的延迟后将任务提交给默认执行器。
反应流
如今,反应式编程在开发应用程序中变得非常受欢迎,以获得一些美丽的好处。Scala、Play、Akka等框架已经集成了反应式流,并获得了许多好处。Oracle Corps也在Java SE 9中引入新的反应式流 API。Java SE 9反应式流 API是一个发布/订阅框架,可以很容易地使用Java语言实现非同步、可扩展和并行应用程序。
- java.util.concurrent.Flow
- java.util.concurrent.Flow.Publisher
- java.util.concurrent.Flow.Subscriber
- java.util.concurrent.Flow.Processor
阅读更多在 [Java 9 反应流]( / 社区 / 教程 / Java-9 反应流)。
匿名内部阶级的钻石操作员
我们知道,Java SE 7引入了一项新功能:Diamond Operator以避免冗余的代码和词汇性,以提高可读性。然而,在Java SE 8中,Oracle Corp(Java Library Developer)发现了使用Diamond Operator与匿名内部类的某些局限性。
1public List getEmployee(String empid){
2 // Code to get Employee details from Data Store
3 return new List(emp){ };
4 }
在这里,我们只使用列表
,而不指定类型参数。
可选类改进
在 Java SE 9 中,Oracle Corp 已向 java.util.Optional 类添加了一些有用的新方法. 在这里,我将用一些简单的例子来讨论其中一种方法:流方法 如果在给定的可选对象中存在一个值,这种流() 方法会返回具有该值的序列流。
1Stream<Optional> emp = getEmployee(id)
2Stream empStream = emp.flatMap(Optional::stream)
在这里,Optional.stream() 方法被用来将可选的员工对象流转换为可选的员工流,这样我们就可以在结果代码中懒惰地处理这个结果。 要了解更多有关该功能的示例,并阅读更多新方法添加到可选类,请参阅我的原始教程: Java SE 9:可选类改进
流程 API 改进
在 Java SE 9 中,Oracle Corp. 已向 java.util.Stream 接口添加了四种有用的新方法. 由于 Stream 是一个接口,所有这些新实现的方法都是默认方法. 其中两种方法非常重要: dropWhile 和 takeWhile 方法 如果您熟悉 Scala 语言或任何函数编程语言,您肯定会知道这些方法。 这些是写一些功能风格代码的非常有用的方法。 让我们在这里讨论 takeWhile 实用方法。 这个 takeWhile() 作为一个论点采取预言,并返回给定的流值子集的流,直到 Predicate 第一次返回假。 如果第一个值不满足 Predicate,它只返回 em Streptyam。
1jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 )
2 .forEach(System.out::println);
31
42
53
64
有关 takeWhile 和 dropWhile 方法以及其他新方法的更多信息,请参阅我的原始教程: [Java SE 9: Stream API 改进](/社区/教程/javase9-stream-api 改进)
改进 @Deprecated 注释
在 Java SE 8 和早期版本中, @Deprecated 注释只是一个没有任何方法的 Marker 界面,它被用来标记一个 Java API,即一个类别,字段,方法,界面,构建器,enum 等在 Java SE 9 中,Oracle Corp 增强了 @Deprecated 注释,以提供更多关于 deprecated API 的信息,并提供一个 ** 工具**来分析应用程序对 deprecated API 的静态使用。
HTTP 2 客户端
在Java SE 9中,Oracle Corp将发布新的HTTP 2客户端API,以支持HTTP/2协议和WebSocket功能。作为现有或传统的HTTP客户端API,有许多问题(如支持HTTP/1.1协议,不支持HTTP/2协议和WebSocket,只在封锁模式和许多性能问题中工作),他们正在用新的HTTP客户端取代这个HttpURLConnection API。他们将在java.net.http
包下引入新的HTTP 2客户端API。它支持HTTP/1.1和HTTP/2协议。它支持同步(Blocking Mode)和非同步模式。它支持使用WebSocket API的同步模式。我们可以在https://download.net.java/jdk/java9s/docs/java/http
1jshell> import java.net.http.*
2
3jshell> import static java.net.http.HttpRequest.*
4
5jshell> import static java.net.http.HttpResponse.*
6
7jshell> URI uri = new URI("https://rams4java.blogspot.co.uk/2016/05/java-news.html")
8uri ==> https://rams4java.blogspot.co.uk/2016/05/java-news.html
9
10jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
11response ==> java.net.http.HttpResponseImpl@79efed2d
12
13jshell> System.out.println("Response was " + response.body(asString()))
请参阅我的原始教程在: Java SE 9: HTTP 2 客户端了解 HTTP/2 协议和 WebSocket,新 API 的好处和 OLD API 的退出与一些有用的例子。
多分辨率图像 API
在Java SE 9中,Oracle Corp将推出一个新的多分辨率图像API。该API中的重要接口是MultiResolutionImage。它在java.awt.image包中可用。MultiResolutionImage封装了不同高度和宽度(即不同分辨率)的图像集,并允许我们根据我们的要求查询它们。
Java 9 功能
在本节中,我只会列出一些不同的Java SE 9新功能,我不说这些功能不那么重要,它们也非常重要和有用,以一些有用的例子来理解它们。到目前为止,我没有得到足够的关于这些功能的信息,这就是为什么我要在这里列出它们,以便简要了解。
- GC (垃圾收集器) 改进
- Stack-Walking API
- Filter Incoming Serialization Data
- Deprecate 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功能,并用足够的描述和示例来更新它们。