Java 9功能与示例
Java 9是一个主要版本,它为开发人员带来了许多功能。
在本文中,我们将详细研究Java 9功能。
Java 10已发布,有关Java 10版本的完整概述,请阅读Java 10功能。
Java 9功能
Java 9的一些重要功能是:
- Java 9 REPL(JShell)
- 不可变列表,集合,映射和Map.Entry的工厂方法
- 接口中的私有方法
- Java 9模块系统
- 流程API的改进
- 尝试改善资源
- CompletableFuture API的改进
- 反应流
- 匿名内部类的钻石运营商
- 可选的类改进
- 流API的改进
- 增强的@Deprecated批注
- HTTP 2客户端
- 多分辨率图像API
- Java 9的其他功能
Oracle Corporation将在2016年3月底左右发布Java SE9。
在本文中,我将通过一些示例简要讨论" Java 9功能"。
Java 9 REPL(JShell)
甲骨文推出了一种名为" jshell"的新工具。
它代表Java Shell,也称为REPL(读取评估打印循环)。
它用于轻松执行和测试任何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基础知识(第1部分)和Java 9 REPL功能(第2部分)。
不可变列表,集合,映射和Map.Entry的工厂方法
Oracle Corp引入了一些便捷的工厂方法来创建不可变列表,Set,Map和Map.Entry对象。
这些实用程序方法用于创建空或者非空的Collection对象。
在Java SE 8和更早版本中,我们可以使用诸如unmodifiableXXX
之类的Collections类实用程序方法来创建Immutable Collection对象。
例如,如果我们要创建一个不可变列表,则可以使用Collections.unmodifiableList
方法。
但是,这些" Collections.unmodifiableXXX"方法是一种乏味且冗长的方法。
为了克服这些缺点,Oracle Corp向List,Set和Map接口添加了一些实用程序方法。
List和Set接口具有" of()"方法来创建一个空的或者不空的不可变List或者Set对象,如下所示:
空列表示例
List immutableList = List.of();
非空列表示例
List immutableList = List.of("one","two","three");
Map有两组方法:of()
方法和ofEntries()
方法,分别用于创建Immutable Map对象和Immutable Map.Entry对象。
空地图示例
jshell> Map emptyImmutableMap = Map.of() emptyImmutableMap ==> {}
非空地图示例
jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three") nonemptyImmutableMap ==> {2=two, 3=three, 1=one}
如果您想了解有关这些实用程序方法的更多信息,请通过以下链接:
- Java 9不可变列表的工厂方法
- 不可变集的Java 9工厂方法
- 用于不可变Map和Map.Entry的Java 9 Factory方法
接口中的私有方法
在Java 8中,我们可以在接口中使用Default和Static方法提供方法实现。
但是,我们不能在接口中创建私有方法。
为了避免冗余代码和提高可重用性,Oracle Corp.将在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 { }
其中我们使用"模块"来创建一个简单的模块。
每个模块都有一个名称,相关代码和其他资源。
要阅读有关此新架构和动手体验的更多详细信息,请在此处浏览我的原始教程:
- Java 9模块系统基础
- 使用命令提示符的Java 9模块示例
- 使用Eclipse IDE的Java 9 Hello World模块示例
流程API的改进
Java SE 9在Process API中进行了一些改进。
他们添加了一些新的类和方法来简化OS进程的控制和管理。
Process API中的两个新的interfcase:
- java.lang.ProcessHandle
- java.lang.ProcessHandle.Info
流程API示例
ProcessHandle currentProcess = ProcessHandle.current(); System.out.println("Current Process Id: = " + currentProcess.getPid());
尝试改善资源
我们知道,Java SE 7引入了一种新的异常处理结构:Try-With-Resources以自动管理资源。
这一新声明的主要目标是"自动更好的资源管理"。
Java SE 9将对此语句进行一些改进,以避免更多的冗长和提高可读性。
Java SE 7示例
void testARM_Before_Java9() throws IOException{ BufferedReader reader1 = new BufferedReader(new FileReader("theitroad.txt")); try (BufferedReader reader2 = reader1) { System.out.println(reader2.readLine()); } }
Java 9示例
void testARM_Java9() throws IOException{ BufferedReader reader1 = new BufferedReader(new FileReader("theitroad.txt")); try (reader1) { System.out.println(reader1.readLine()); } }
要了解有关此新功能的更多信息,请浏览我的原始教程,网址为:Java 9 Try-With-Resources Improvements
CompletableFuture API的改进
在Java SE 9中,Oracle Corp将改进CompletableFuture API,以解决Java SE 8中提出的一些问题。
它们将被添加以支持某些延迟和超时,某些实用程序方法以及更好的子类化。
Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
这里的delayExecutor()是一种静态实用程序方法,用于返回新的Executor,该Executor在给定的延迟后将任务提交给默认的执行器。
反应流
如今,响应式编程在开发应用程序中变得非常流行,从而获得了一些美丽的好处。
Scala,Play,Akka等。
框架已经集成了Reactive Streams,并获得了很多好处。
Oracle Corps还在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
在Java 9 Reactive Streams上了解更多信息。
匿名内部类的钻石运算符
我们知道,Java SE 7引入了一项新功能:Diamond运算符可避免多余的代码和冗长的内容,从而提高了可读性。
但是,在Java SE 8中,Oracle Corp(Java库开发人员)发现将Diamond运算符与匿名内部类一起使用时存在一些限制。
他们已解决了这些问题,并将其作为Java 9的一部分发布。
public List getEmployee(String empid){ //Code to get Employee details from Data Store return new List(emp){ }; }
其中我们仅使用"列表"而不指定类型参数。
可选的类改进
在Java SE 9中,Oracle Corp向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类的新方法,请浏览我的原始教程,网址为:Java SE 9:Optional Class Improvements
流API的改进
在Java SE 9中,Oracle Corp向java.util.Stream接口添加了四个有用的新方法。
因为Stream是接口,所以所有这些新实现的方法都是默认方法。
其中两个非常重要:dropWhile和takeWhile方法
如果您熟悉Scala语言或者任何函数编程语言,则一定会知道这些方法。
这些是编写某些功能样式代码的非常有用的方法。
让我们在这里讨论takeWhile实用程序方法。
该takeWhile()将谓词作为参数,并返回给定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 SE 9:Stream API的改进
增强的@Deprecated批注
在Java SE 8和更早版本中,@ Deprecated注释只是一个Marker接口,没有任何方法。
它用于标记Java API,它是类,字段,方法,接口,构造函数,枚举等。
在Java SE 9中,Oracle Corp增强了@Deprecated批注,以提供有关已弃用的API的更多信息,并提供一种工具来分析应用程序对已弃用的API的静态使用情况。
他们在此不推荐使用的接口中添加了两种方法:forRemoval和从那时起提供此信息。
HTTP 2客户端
在Java SE 9中,Oracle Corp.将发布新的HTTP 2 Client API,以支持HTTP/2协议和WebSocket功能。
由于现有的或者旧版HTTP客户端API存在许多问题(例如支持HTTP/1.1协议,并且不支持HTTP/2协议和WebSocket,仅在阻止模式下工作,并且存在很多性能问题。
),他们将HttpURLConnection API替换为新的HTTP。
客户。
他们将在" java.net.http"包下引入一个新的HTTP 2 Client 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客户端示例
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/2015/05/java-news.html") uri ==> https://rams4java.blogspot.co.uk/2015/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的优点以及OLD API的缺点以及一些有用的示例。
多分辨率图像API
在Java SE 9中,Oracle Corp将引入一个新的Multi-Resolution Image API。
此API中的重要接口是MultiResolutionImage。
在java.awt.image包中可用。
MultiResolutionImage封装了一组具有不同高度和宽度(即不同分辨率)的图像,并允许我们根据需求查询它们。
Java 9的其他功能
在本部分中,我将列出一些Java SE 9的其他新功能。
我并不是说这些不是那么重要的功能。
通过一些有用的示例,它们对于理解它们也非常重要和有用。
截至目前,我还没有获得有关这些功能的足够信息。
这就是为什么我将在此处列出它们以进行简要了解的原因。
我将逐一介绍这些功能,并通过简短的讨论和示例将其添加到以上部分中。
最后,以后再写一个单独的教程。
- GC(垃圾收集器)改进
- 堆栈步行API
- 筛选传入的序列化数据
- 弃用Applet API
- 字符串化连接
- 增强的方法句柄
- Java平台日志记录API和服务
- 紧凑弦
- Nashorn的解析器API
- Javadoc搜索
- HTML5 Javadoc