Java 9新特性


一、JShell:交互式Java REPL

引入了交互式编程环境(REPL),也就是JShell。它允许程序员执行Java脚本代码,并且立即返回结果。在没有交互式编程环境的情况下,要运行代码,只能创建一个工程,编译并运行。有了交互式编程环境以后,当只需要测试部分代码正确性的时候就非常容易了。只需要把代码直接在交互环境下运行就可以马上看到运行结果,而不需要创建工程。因此非常有利于代码的调试。

二、不可变集合工厂方法

Java 9增加了List.of()、Set.of()、Map.of()和Map.ofEntries()等一系列的工厂方法来创建不可变集合,从而简化了创建过程。

三、私有接口方法

在接口中引入了私有方法,够将冗余代码提取到通用的私有方法中,一方面增加了代码的重用性,减少冗余,另一方面也实现了代码的隐藏,使得这些方法对API用户不可见。

在接口中编写私有方法时,应该遵循以下规则:

1)应该使用私有修饰符(private)来修饰这些方法。

2)不能使用abstract来修饰这些方法。因为“私有”方法意味着完全实现的方法,对子类是不可见的,因此也就无法在子类中来实现。

四、平台级模块系统

模块化是软件工程中非常重要的一个概念。它能把独立的功能封装成模块,并提供接口供外部使用是模块化在软件工程中有着非常重要的作用。

功能:

1)降低代码间的耦合,增加代码的内聚,是代码更容易维护。

2)能够有效降低工程的复杂度。

3)能提供更好的伸缩性和扩展性。

4)模块系统的出现意味着public不是对所有类可见了。

5)每个模块可以指定自己依赖的模块,因此也就有足够多的信息在编译期或在程序启动的时候就可以抛出异常。同时各个模块可以根据需求指定自己需要的第三方库对应的版本。

6)模块化系统的出现不仅允许开发者模块化自己的应用程序,同时也对JDK本身进行了模块化,因此一个应用程序就可以只包含它所需要的类库。

五、进程API的改进

增加了一个名为ProcessHandle的接口来增强java.lang.Process类。ProcessHandle用来标识一个本地进程,它允许查询进程状态并管理进程。

此外,ProcessHandle接口中声明的onExit() 方法可用于在某个进程终止时触发某些操作。

六、try-with-resources

try块中可以直接引用外部声明的资源,而不需要外声明一个引用。

InputStream fis = new FileInputStream("a.txt");

try(fis){
while(fis.read()!=-1){
System.out.println(fis.read());
}
}catch(Exception e){
e.pritStackTrace();
}

七、Stream API的改进

增加了dropWhile、takeWhile、ofNullable和iterate四个非常便利的方法,使得对流的处理更加容易。

takeWhile方法

这个方法使用了一个断言作为参数,断言其实就是一个布尔表达式,它的返回值为true或false。这个方法会返回给定Stream的子集直到断言语句第一次返回false。如果第一个值不满足断言条件,那么需要注意的是takeWhile会返回从开头开始的尽量多的元素。

default Stream<T> takeWhile(Predicate<? super T> predicate)

dropWhile方法

dropWhile方法和takeWhile作用相反的,使用一个断言作为参数,直到断言语句第一次返回true才返回给定Stream的子集。也就是说这个方法会最大限度地扔掉满足断言的条件的元素,然后把剩余的元素作为返回值。

default Stream<T> dropWhile(Predicate<? super T> predicate)

ofNullable方法

这个方法用来返回非空的元素来避免NullPointerExceptions。

static<T> Stream<T> ofNullable(T t);

iterate方法

这个方法返回一个stream,这个stream中的元素是通过下面的逻辑生成出来的:第一个参数作为起始值,第二个参数作为断言,第三个参数用来指定生成下一个元素的逻辑。

static<T> Stream<T> iterate(T seed,Predicate<? super T>hasNext,UnaryOperator<T> next);