JDK9的新特性是否需要了解一下?
昨天我们讲了 JDK8 在使用方面的一些小技巧,能够加快我们的开发效率,让我们开发变得更加的简单快捷,但是呢,就有读者给反映了,先在 JDK都已经出到20了,那么为什么没人使用呢,也没有文章说说都更新了哪些内容,有什么新特性,再加上官网上都是英文,看起来也是及其不方便,于是了不起就来安排一下,今天我们来看看 JDK9 中都更新了哪些内容呢?分别又是什么作用呢?
JDK9
至于下载的话,直接去官网下载就可以,
Oracle下载官网
下载之后,安装什么的,了不起也就不讲了,配置环境变量是真的没什么可以说的,我们直接来看都更新了什么内容吧,毕竟也是一个版本一个版本的往上升级学习的。
内容定义模块化
其实这个模块化就是进行了内容定义,需要哪些包对外访问,哪些不对外。
创建方式也是不复杂的:
exports 是到指的导出包;
requires 则是导入包;
接口定义私有方法
我们看一下
public interface MyInterface {
// jdk 7 声明的抽象方法
void thod1();
// jdk 8 声明的静态抽象方法
public static void thod2(){
System.out.println("默认 static 方法");
};
// jdk 8 声明的默认方法
default void thod3(){
System.out.println("默认方法");
thod1();
thod4();
};
// jdk 9 声明的私有方法
private void thod4(){
System.out.println("私有方法");
thod1();
}
}
从 JDK8 就已经开始有变化了,有没有发现呢?
而且在异常处理方面,也有不小的更新,方便了很多了。
异常处理
// jdk 8 之前的写法
InputStreamReader reader = null;
try {
reader = new InputStreamReader(System.in);
reader.read();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// jdk 8 的写法
try (InputStreamReader reader2 = new InputStreamReader(System.in)) {
reader2.read();
} catch (Exception e) {
e.printStackTrace();
}
// jdk 9 的写法
InputStreamReader reader3 = new InputStreamReader(System.in);
try (reader3) {
reader3.read();
} catch (Exception e) {
e.printStackTrace();
}
HashMap后增加匿名内部类
//java6及以前
Map<String,String> map7 = new HashMap<String,String>();
//java7和8 <>没有了数据类型
Map<String,String> map8 = new HashMap<>();
//java9 添加了匿名内部类的功能 后面添加了大括号{} 可以做一些细节的操作
Map<String,String> map9 = new HashMap<>(){};
String底层结构的变更
其实这个再我们的使用过程中,好像是根本看不到任何的区别的,只是底层结构做出了变更。
JDK8 之前 String 的底层结构类型都是 char [] , 但是 JDK9 就替换成 byte [] 这样来讲,更节省了空间和提高了性能。
JDK8中的 String
JDK9中的 String
不看不知道,一看还是真变更了,为什么变更成byte呢?
之所以替换是因为之前一直是最小单位是一个 char,用到两个 byte,
但是 JDK8 是基于 latin1 的,而这个 latin1 编码可以用一个 byte 标识,所以当你数据明明可以用到一个 byte 的时候,我们用到了一个最小单位 chat 两个 byte,就多出了一个 byte 的空间。
所以 JDK9 在这一方面进行了更新,现在的 JDK9 是基于 ISO/latin1/Utf-16 ,latin1 和 ISO 用一个 byte 标识,UTF-16 用两个 byte 标识
JDK9 会自动识别用哪个编码,当数据用到 1byte,就会使用 iSO 或者 latin1 ,当空间数据满足 2byte 的时候,自动使用 utf-16, 节省了很多空间。
其实最让了不起感觉比较有意思的就是 Stream 也做了一些更新,
Stream流上的更新
在原有 Stream API 新添加了 4 个方法,takeWhile dropWhile ofNullable iterate (新重载方法)
- takeWhile 当达到一定条件就结束:
List<Integer> integerList = new ArrayList<>();
integerList.stream().takeWhile(params -> params <40).forEach(System.out::println);
List 的内部元素有这些 [20, 30, 40, 50, 50]
这样我们看看输出结果:
满足条件就退出了,所以只打印了 20 和 30
而 dropWhile 则和 takeWhile 相反
List<Integer> integerList = new ArrayList<>();
integerList.stream().dropWhile(params -> params <40).forEach(System.out::println);
输出结果则是相反的:
- ofNullable
// ofNullable
Stream<Object> o1 = Stream.ofNullable(null);
long count = o1.count(); // 结果是0 不会出现异常
System.out.println(count);
ofNullable, 在 java8 中 Stream 中的元素不能完全为 null,否则空指针异常,而在 java9 的升级中,允许创建 null
- iterate
iterate可以充当循环用,在JDK8中iterate需要配合limit作为终止条件,这样不够灵活。JDK9中提供了类似for的形式iterate函数重载。
//JDK8 使用iterate方法,需配合limit截止。
Stream.iterate(1, (x) -> x + 1).limit(10).forEach(System.out::print);
System.out.println();
//JDK9 使用iterate的重载方法可以直接使用Predicate来截止。
Stream.iterate(1,(x) -> x <= 10, (x) -> x + 1).forEach(System.out::print);
还有一个新的特性那就是把 HttpClient 引入了,不再需要我们去依赖某些第三方组件来实现。
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
class Test {
public static void main(String[] args) throws IOException, InterruptedException {
HttpClient cli = HttpClient.newHttpClient();
HttpResponse<String> res = cli.send(HttpRequest.newBuilder().GET().uri(URI.create("https://www.cnblogs.com")).build(), HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());
}
}
关于 JDK9 的新特性,你了解了么?
文章转载自公众号:Java极客技术