Java 9发布于2017年9月,目前已停止更新(Java SE 9 has reached end of support. ),是一个non-LTS(Long Term Support)版本,JDK10 发布于2018年3月,咋看起来,Oracle公司加快了JAVA版本的频率,但按照Oracle公司的说法,其实并没有,依然是按照之前的操作惯例,希望每六个月维护一个稳定的“版本更新”(大佬还特意拿Java 8 举例,比如,Java 8发布于2014年3月,而8u20发布于差不多6个月后的8月,8u40也差不多在8u20之后的6个月后发布)。至于10和11为什么不叫9u20、9u40,Oracle公司希望通过简化JCP流程,能够做到在很短的时间内就可以引入新的类库、JVM和语言特性,并且及时向用户推出,而不是像过去那样必须等待数年的主要版本更新(这算一种发布命名策略的改变?),关于这一点,感兴趣的可以参考这篇文章:Update and FAQ on the Java SE Release Cadence
图片来源:https://www.oracle.com/technetwork/java/eol-135779.html
目前JDK最新版本为JDK11
这里还是回顾下Java 9 的一些新特性
It stands for Java Shell and also known as REPL (Read Evaluate Print Loop). It is used to execute and test any Java Constructs like class, interface, enum, object, statements etc. very easily.
这里使用JShell 11 做演示
在以前的版本中,我们通过Collections的unmodifiableXXX
方法来创建不可修改集合对象,但这种方式并不是那么直观贴切。在新版本中,我们可以通过List 、Set、Map接口的of
方法来达到响应的目的。
List immutableList = List.of("one", "two", "three");
List emptyImmutableList = List.of();
System.out.println(immutableList);
System.out.println(emptyImmutableList);
Map immutableMap = Map.of(1, "one", 2, "two", 3, "three");
Map emptyImmutableMap = Map.of();
System.out.println(immutableMap);
System.out.println(emptyImmutableMap);
Map nonEmptyImmutableMap = Map.ofEntries(entry(1, "one"), entry(2, "two"), entry(3, "three"));
System.out.println(nonEmptyImmutableMap);
执行结果:
[one, two, three]
[]
{3=three, 2=two, 1=one}
{}
{3=three, 2=two, 1=one}
Java 8中可以通过Default和Static关键字来定义默认方法实现,但无法创建私有方法,新版本中可以支持这一操作。
public interface Card{
private Long createCardID(){
// Method implementation goes here.
}
private static void displayCardDetails(){
// Method implementation goes here.
}
}
模块化应该是Java 9中最大的一个变化了。关于模块化的一些应用示例可参考如下链接:
Java 9 Module System Basics
Java 9 Module Examples using command prompt
Java 9 Hello World Module Example using Eclipse IDE
新增两个Process API 接口
java.lang.ProcessHandle
java.lang.ProcessHandle.Info
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Current Process Id: = " +currentProcess.getPid());
currentProcess.getPid()方法在JDK11中已经更新为currentProcess.pid()
Java 7中引入了Try-With-Resources机制实现对资源的自动管理。Java 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());
}
}
接口增加支持延迟和超时设置
Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
Java 9的响应式Streams API是一个发布订阅框架,可以方便的实现异步的、可扩展的、并行处理程序。主要实现类:
java.util.concurrent.Flow
java.util.concurrent.Flow.Publisher
java.util.concurrent.Flow.Subscriber
java.util.concurrent.Flow.Processor
Java 7中引入了Diamond操作符,就是左右尖括号<>
,来避免代码冗余,然而在Java 8中针对匿名内部类使用Diamond操作符存在一定的限制,Java 9解决了遗留BUG。
针对java.util.Optional类,Java 9中新增了一些有用的方法实现,比如stream方法。如果Optional对象中包含值,那么stream方法将会返回一个包含该值的Stream,否则返回一个空Stream。
Stream emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)
Java 9中针对java.util.Stream接口新增了四个方法,所有新增的四个方法都是接口中的默认方法,其中两个比较重要的是dropWhile 与 takeWhile ,如果你熟悉函数式编程,那么下面的这种代码你应该不会陌生。
Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).takeWhile(i -> i < 5)
.forEach(System.out::println);
Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).dropWhile(i -> i < 5)
.forEach(System.out::println);
在Java 9之前,@Deprecated 只是一个注解接口,不包含任何方法,Java 9中针对@Deprecated新增了since和forRemoval方法,同时还提供了相应的分析工具来分析@Deprecated的使用情况。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {
/**
* Returns the version in which the annotated element became deprecated.
* The version string is in the same format and namespace as the value of
* the {@code @since} javadoc tag. The default value is the empty
* string.
*
* @return the version string
* @since 9
*/
String since() default "";
/**
* Indicates whether the annotated element is subject to removal in a
* future version. The default value is {@code false}.
*
* @return whether the element is subject to removal
* @since 9
*/
boolean forRemoval() default false;
}
HTTP2 Client位于java.net.http包下,同时支持HTTP/1.1 和HTTP/2协议,及同步、异步模式,支持异步模式使用WebSocket API
更多可参考:http://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html
java.awt.image 包中新增MultiResolutionImage接口,**MultiResolutionImage **通过封装不同尺寸的图片集来允许我们根据不同的需求来检索。
除上述讨论的一些特性之外,Java 9还涉及引入了以下新特性:
参考链接
https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-release-cadence
https://www.oracle.com/technetwork/java/eol-135779.html
https://www.oracle.com/technetwork/java/javase/downloads/index.html
https://www.journaldev.com/13121/java-9-features-with-examples
http://openjdk.java.net/projects/jdk9/