Java 9功能与示例

时间:2020-02-23 14:36:19  来源:igfitidea点击:

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