JDK9的新特性是否需要了解一下?

WilliamGates
发布于 2023-9-28 10:43
浏览
0收藏

昨天我们讲了 JDK8 在使用方面的一些小技巧,能够加快我们的开发效率,让我们开发变得更加的简单快捷,但是呢,就有读者给反映了,先在 JDK都已经出到20了,那么为什么没人使用呢,也没有文章说说都更新了哪些内容,有什么新特性,再加上官网上都是英文,看起来也是及其不方便,于是了不起就来安排一下,今天我们来看看 JDK9 中都更新了哪些内容呢?分别又是什么作用呢?

JDK9

至于下载的话,直接去官网下载就可以,

Oracle下载官网

下载之后,安装什么的,了不起也就不讲了,配置环境变量是真的没什么可以说的,我们直接来看都更新了什么内容吧,毕竟也是一个版本一个版本的往上升级学习的。


内容定义模块化


其实这个模块化就是进行了内容定义,需要哪些包对外访问,哪些不对外。

JDK9的新特性是否需要了解一下?-鸿蒙开发者社区

创建方式也是不复杂的:

JDK9的新特性是否需要了解一下?-鸿蒙开发者社区

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的新特性是否需要了解一下?-鸿蒙开发者社区

JDK9中的 String

JDK9的新特性是否需要了解一下?-鸿蒙开发者社区

不看不知道,一看还是真变更了,为什么变更成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]​

这样我们看看输出结果:

JDK9的新特性是否需要了解一下?-鸿蒙开发者社区

满足条件就退出了,所以只打印了 20 和 30

而 dropWhile 则和 takeWhile 相反

        List<Integer> integerList = new ArrayList<>();
        integerList.stream().dropWhile(params -> params <40).forEach(System.out::println);

输出结果则是相反的:

JDK9的新特性是否需要了解一下?-鸿蒙开发者社区

  • 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极客技术

标签
已于2023-9-28 10:43:46修改
收藏
回复
举报
回复
    相关推荐