预计新的Java版本9将发布2017年7月27日。让我们来看看有什么特点的意志,并解释为什么需要他们。
这里是一个重要的创新的Java 9列表:
甲骨文推出了一个名为«JShell»新工具。它用于测试和使用在控制台不同的设计,诸如类,接口,枚举,对象,操作员等
顺便说一句,现在你可以下载JDK 9的beta版本,从官方网站下载。
在Java SE 8级更早的版本中,我们可以使用Collections.unmodifiableXXX创建不变对象的集合。举例来说,如果我们要建立不可变列表,我们将使用Collections.unmodifiableList方法。
然而,这是不方便的,因此甲骨文还增加了一些辅助的方法来接口列表,Set和Map。
集列表和接口(方法)。其使用的例子可以看到下面:
地图有两套方法:()方法和ofEntries()方法来创建对象的不可变的映射和Map.Entry的。
为了摆脱杂乱,且甲骨文代码的过剩将会在Java SE中添加私有方法9.接口与第九版开始,我们还可以使用私有创建接口的私人静态方法。
创建默认的接口方法实现
下面是一些本系统的特点:
模块化JDK;
模块化Java源代码;
模块化运行时图像;
内部API的封装;
模块化的系统平台;
JDK 9与92个模块提供。我们可以使用它们或创建自己的,例如:
在进程API两个新的界面:
java.lang.ProcessHandle;
java.lang.ProcessHandle.Info。
示例处理API:
例如:
在Scala中,播放,阿卡已经集成反应流。甲骨文决定增加无功流API在Java SE 9。
Java SE的反应9 API流 - 实现使用Java异步的,可扩展性和并行应用程序的框架。
在Java SE 9会看到下面的API:
java.util.concurrent.Flow;
java.util.concurrent.Flow.Publisher;
java.util.concurrent.Flow.Subscriber;
java.util.concurrent.Flow.Processor。
这个问题不指定(英语非denotable)由编译器和JVM识别的类型 - 不。 (这种情况下可以通过编译器来处理,但问题是 - 如何正确地传达它的JVM)
因此Diamond 语句是不允许使用匿名类。现在,它是可能的。
下面是它看起来如何在Java中9:
如果你熟悉的语言和Scala的函数式编程,你一定要学会这些技术。
最简单的使用流:
新的API将在«java.net.http»包装呈现。它同时支持同步和异步模式。
新的API可以在甲骨文的文档部分的官方网站上找到。
实施例HTTP / 2客户端:
这里是一个重要的创新的Java 9列表:
- JShell;
- 不可变List,Set和地图盒;
- 私有方法的接口;
- 模块化系统;
- 改进API;
- try-with-resources变化;
- 反应式编程;
- Diamond 运营商匿名类;
- 类更多方面的改进;
- 改进Stream API;
- 高级注释 @Deprecated;
- HTTP/2 客户端;
- API 响应图像;
- 杂项.
随着示例的帮助下告诉你更多关于这些功能。
JShell
REPL(读英语-EVAL-打印循环。) - 在控制台交互编程系统。也就是说,如果用户输入的线的上控制台代码出现它的执行的结果,并且重复该过程。甲骨文推出了一个名为«JShell»新工具。它用于测试和使用在控制台不同的设计,诸如类,接口,枚举,对象,操作员等
顺便说一句,现在你可以下载JDK 9的beta版本,从官方网站下载。
与JShell工作的最简单的例子:
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
不可变对象名单,设置和地图“开箱即用”
甲骨文推出一些简便的方法,而无需使用额外的类来创建不可改变的名单,设置,地图和Map.Entry对象在Java SE 8级更早的版本中,我们可以使用Collections.unmodifiableXXX创建不变对象的集合。举例来说,如果我们要建立不可变列表,我们将使用Collections.unmodifiableList方法。
然而,这是不方便的,因此甲骨文还增加了一些辅助的方法来接口列表,Set和Map。
集列表和接口(方法)。其使用的例子可以看到下面:
List immutableList = List.of(); // 空的不可变列表
List immutableList = List.of("one","two","three"); // 不可改变包含列表信息
地图有两套方法:()方法和ofEntries()方法来创建对象的不可变的映射和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 8中,我们可以保证该方法的接口使用默认和静态方法的实现。但是,我们不能创建在接口私有方法。为了摆脱杂乱,且甲骨文代码的过剩将会在Java SE中添加私有方法9.接口与第九版开始,我们还可以使用私有创建接口的私人静态方法。
创建默认的接口方法实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
interface
Card
{
private
Long
createCardID
(
)
{
// 此方法实现是怎么回事。
}
private
static
void
displayCardDetails
(
)
{
// 此方法实现是怎么回事。
}
}
|
模块化系统
其中最显著的变化是一个模块化系统的出现。之前,我们使用的Java 9 JAR-文件基础上开发的Java应用程序。然而,这种结构有一些局限性和缺点。为了消除它们,并推出了模块化系统。这种创新是拼图,它正在开发,以确保程序员可以在程序分成独立和交叉程序模块的一部分。
下面是一些本系统的特点:
模块化JDK;
模块化Java源代码;
模块化运行时图像;
内部API的封装;
模块化的系统平台;
JDK 9与92个模块提供。我们可以使用它们或创建自己的,例如:
1
|
module
com
.
foo
.
bar
{
}
|
每个模块都有一个名字相关的代码和其他资源。
提高API
据预计,在Java SE 9将改进关于API的一部分。几个新类和操作系统行为的更好的管理方法添加。
在进程API两个新的界面:
java.lang.ProcessHandle;
java.lang.ProcessHandle.Info。
示例处理API:
1
2
3
|
ProcessHandle
currentProcess
=
ProcessHandle
.
current
(
)
;
System
.
out
.
println
(
"Current Process Id: = "
+
currentProcess
.
getPid
(
)
)
;
|
在这里,我们ProcessHandle类型创建与操作系统行动工作对象。
try-with-resources变化
我们知道,在Java SE 7中有一个新的异常处理的设计尝试,随着国际资源进行自动的资源管理。在Java SE 9要对设计进行一些修改,以提高可读性。
在Java SE 7的一个例子:
1
2
3
4
5
6
7
8
9
|
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例子:
1
2
3
4
5
6
7
8
9
|
void
testARM_Java9
(
)
throws
IOException
{
BufferedReader
reader1
=
new
BufferedReader
(
new
FileReader
(
"journaldev.txt"
)
)
;
try
(
reader1
)
{
System
.
out
.
println
(
reader1
.
readLine
(
)
)
;
}
}
|
可以注意到的是,在新版本中,后尝试没有必要声明一个新变量。
在CompletableFuture API创新
在Java中9,Oracle还打算改善CompletableFuture API来解决已经出现在Java SE 8的计划增加的延迟和超时,更多的手段和完善的子类的问题。
例如:
1
|
Executor
exe
=
CompletableFuture
.
delayedExecutor
(
50L
,
TimeUnit
.
SECONDS
)
;
|
有delayedExecutor() - 用于返回延时,在预定延迟后的静态方法
反应式编程
对于那些谁不熟悉的反应式编程范式,我们建议您阅读我们的介绍与实例的话题。
在Scala中,播放,阿卡已经集成反应流。甲骨文决定增加无功流API在Java SE 9。
Java SE的反应9 API流 - 实现使用Java异步的,可扩展性和并行应用程序的框架。
在Java SE 9会看到下面的API:
java.util.concurrent.Flow;
java.util.concurrent.Flow.Publisher;
java.util.concurrent.Flow.Subscriber;
java.util.concurrent.Flow.Processor。
Diamond 运营商匿名类
假设我们有一个类箱<T>,我们希望把它匿名。
以下是Java 8的过程:
1
2
3
4
5
|
<T>
Box
<T>
createBox
(
T
content
)
{
// 我们需要把“T”这里:(
return
new
Box
<T>
(
content
)
{
}
;
}
|
这不是很明显的是,箱应该是T型的?在非匿名类的情况下,编译器会选择合适的类型,为什么不能做相同的匿名?
这个问题不指定(英语非denotable)由编译器和JVM识别的类型 - 不。 (这种情况下可以通过编译器来处理,但问题是 - 如何正确地传达它的JVM)
因此Diamond 语句是不允许使用匿名类。现在,它是可能的。
下面是它看起来如何在Java中9:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class
inJava
{
<
T
>
Box
<
T
>
createBox
(
T
content
)
{
// Java 9 只显示“T”,因为这种类型的指定
return
new
Box
<>
(
content
)
{
}
;
}
Box
<?
>
createCrazyBox
(
Object
content
)
{
List
<?
>
innerList
=
Arrays
.
asList
(
content
)
;
//这种类型不会出现,因为我们不能将其标记:
//返回新盒<>(innerList){}; //相反,我们表示,我们需要的类型:
return
new
Box
<
List
<
?
>>
(
innerList
)
{
}
;
}
}
|
类的其他改进
在Java SE 9甲骨文增加了许多的java.util.Optional有用的技术。
这里有一个例子是怎么流的方法:
1
2
3
|
Stream
<
Optional
>
emp
=
getEmployee
(
id
)
;
Stream
empStream
=
emp
.
flatMap
(
Optional
::
stream
)
;
|
它使用Optional.stream()方法,它转换Employee流中的一切。
改进 Stream API
新版本将至少有四种方法java.util.Stream。像流,他们都将是标准。这是最重要的,dropWhile takeWhile方法。
如果你熟悉的语言和Scala的函数式编程,你一定要学会这些技术。
最简单的使用流:
1
|
jshell
>
Stream
.
of
(
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
)
.
takeWhile
(
i
->
i
<
5
)
.
forEach
(
System
.
out
::
println
)
;
|
高级注释 @Deprecated
在此之前的Java 9 @Deprecated - 只是一个标记接口。许多开发人员提供甲骨文提高对过时的API能力的认识。他们听到,并添加了过时的API合作的可能性。例如,有分析工具 - forRemoval以来。
HTTP/2 客户端
甲骨文计划推出为HTTP / 2和WebSocket协议一个新的HTTP客户端的支持。他们更换HttpURLConnection的API到一个新的,更高效。
新的API将在«java.net.http»包装呈现。它同时支持同步和异步模式。
新的API可以在甲骨文的文档部分的官方网站上找到。
实施例HTTP / 2客户端:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
jshell
>
import
java
.
net
.
http
.
*
jshell
>
import
static
java
.
net
.
http
.
HttpRequest
.
*
jshell
>
import
static
java
.
net
.
http
.
HttpResponse
.
*
jshell
>
URI
uri
=
new
URI
(
"http://rams4java.blogspot.co.uk/2016/05/java-news.html"
)
uri
==
>
http
:
//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
(
)
)
)
|
API 与不同分辨率的图像
甲骨文计划推出一个新的API为不同的图像分辨率。最重要的是java.awt.image中封装MultiResolutionImage接口。
其他变化
更改垃圾收集器;
在API堆栈行走的变化;
过滤传入数据序列;
禁用API小程序;
更改级联;
改进MethodHandle;
记录;
对于Nashorn API解析器;
搜索的JavaDoc;
HTML5的JavaDoc。
在API堆栈行走的变化;
过滤传入数据序列;
禁用API小程序;
更改级联;
改进MethodHandle;
记录;
对于Nashorn API解析器;
搜索的JavaDoc;
HTML5的JavaDoc。