JDK8到JDK17新特性

目录

  • 版本区分
  • JDK8
    • Lambda
    • Stream
    • Optional
    • 时间 API
    • 方法引用
    • 内置 Base64
  • JDK9
    • 接口可以添加私有方法
    • 异常处理 try 升级
    • 增强钻石操作符 <>
    • 增强了 JDK8 特性
    • 引进 HttpClient
  • JDK10
    • 局部变量 var
    • copyOf 方法
    • 垃圾收集器的优化
  • JDK11
    • Lambda 中使用 var
    • 字符串 API 增强
    • javac + java 命令合并
  • JDK12
    • Switch 优化
    • instanceof + 类型强转
  • JDK13
    • Switch 优化
    • Switch 优化
  • JDK14
    • 新增 Record
    • 新增 Record
  • JDK15
    • 支持 Unicode 13.0
    • 封闭 Sealed 类
  • JDK16
    • Stream 新增 toList 方法
  • JDK17
    • 随机数增强

版本区分

预览版:该功能在当前版本可以使用,如果效果不是很好的话,可能以后的其他版本就会删去该功能。
最终版:该功能在之前版本效果很好,之后的每个版本中都会存在该功能。

JDK8


Lambda

/**

* 匿名开启一个线程

*/

public static void jdk8Lambda() {

    new Thread(() -> System.out.println("-------------")).start();

}

Stream

Java 8 API 添加了一个新的抽象称为流 Stream,可以让你以一种声明的方式处理数据。

/**

* 去重

*/

public static void jdk8Stream() {

    List<String> list2 = new ArrayList<>();

    list2.add("aaa bbb ccc");

    list2.add("ddd eee fff");

    list2.add("ggg hhh iii");

    list2.add("ggg hhh iii");

    list2.stream().distinct().forEach(System.out::println);

}

Optional

Optional 类是一个可以为 null 的容器对象。如果值存在则 isPresent() 方法会返回 true,调用 get() 方法会返回该对象。

/**

* optional

*/

public static void jdk8Optional() {

    // 1、创建一个包装对象值为空的Optional对象

    Optional<String> optStr = Optional.empty();

    // 2、创建包装对象值非空的Optional对象

    Optional<String> optStr1 = Optional.of("xiaofei");

    // 3、创建包装对象值允许为空的Optional对象

    Optional<String> optStr2 = Optional.ofNullable(null);

}

时间 API

/**

* 时间API

*/

public static void jdk8DateTime() {

    // 获取当前年月日

    LocalDate localDate = LocalDate.now();

    System.out.println(localDate);

    // 获取当前时间

    LocalTime localTime = LocalTime.now();

    System.out.println(localTime);

    // 获取具体时间

    LocalDateTime localDateTime = LocalDateTime.now();

    System.out.println(localDateTime);

    // 字符串转换

    String str = "2022-01-01";

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    LocalDate localDate2 = LocalDate.parse(str, formatter);

    System.out.println(localDate2);

}

方法引用

/**

* 方法引用

*/

public static void jdk8Method() {

    List<String> names = new ArrayList();

    names.add("Xf");

    names.add("xiaofei");

    // 实例中我们将 System.out::println 方法作为静态方法来引用。

    names.forEach(System.out::println);

}

内置 Base64

/**

* Base64

*/

public static void jdk8Base64() {

    // 使用基本编码

    String base64encodedString = null;

    try {

    base64encodedString = Base64.getEncoder().encodeToString("xiaofei".getBytes("utf-8"));

    System.out.println("Base64编码字符串:" + base64encodedString);

    // 解码

    byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);

    System.out.println("Base64解码字符串:" + new String(base64decodedBytes));

    } catch (UnsupportedEncodingException e) {

    e.printStackTrace();

    }

}

JDK9


接口可以添加私有方法

/**

 * 接口可以添加私有方法

 */

interface Jdk9Interface{



    default String defaultTest() {

        privateTest();

        return "default";

    }



    private String privateTest() {

        System.out.println("私有方法");

        return "private";

    }

}

异常处理 try 升级

Jdk8每一个流打开的时候都要关闭, 但是在 try 的括号中来进行关闭。

Jdk9 直接在括号里面写变量就可以关闭了。

/**

*  异常处理try升级

*/

public static void jdk9Try(){

    // jdk8:

    try(InputStreamReader reader =new InputStreamReader(System.in)){

    reader.read();

    }catch (IOException e){

    e.printStackTrace();

    }

    // jdk9以后:

    InputStreamReader reader =new InputStreamReader(System.in);

    try(reader){

    reader.read();

    }catch (IOException e){

    e.printStackTrace();

    }

}

增强钻石操作符 <>

/**

    * 增强钻石操作符 "<>"

    */

    public static void jdk9Diamonds(){

    // java7和8 <>没有了数据类型

    Map<String,String> map8 = new HashMap<>(1);

    // java9 添加了匿名内部类的功能 后面添加了大括号{}  可以做一些细节的操作

    Map<String,String> map9 = new HashMap<>(1){

    @Override

    public int size() {

    return 0;

    }

    };

}

增强了 JDK8 特性

增强了 JDK8 的特性如:Stream,Optional,Process API

引进 HttpClient

以往我们都是通过 maven 添加 httpclient ,java9 直接引入即可。

JDK10


局部变量 var

将前端思想 var 关键字引入 java 后段,自动检测所属于类型,一种情况除外,不能为 null,因为不能判断具体类型,会报异常。

/**

* 局部变量var

*/

public static void jdk10Var() {

    var number = 10;

    var str    = "小飞博客";

    var list   = new ArrayList<>(1);

    var map    = new HashMap<>(1);

    var set    = new HashSet<>(1);

}

copyOf 方法

在 java.util.List、java.util.Set、java.util.Map 新增加了一个静态方法 copyOf,这些方法按照其迭代顺序返回一个不可修改的列表、集合或映射包含了给定的元素的集合。但是如果将返回后的集合继续修改,那么报异常。

/**

* copyOf方法

*/

public static void jdk10CopyOf() {

    var list = new ArrayList<>();

    list.add("first");

    list.add("second");

    list.add("third");

    var result = List.copyOf(list);

    System.out.println(result.toString());

}

垃圾收集器的优化

1、JDK9:新生代:ParNew 收集器。 老年代:Parallel Old 收集器

2、JDK10:G1(Garbage-First)全收集器

3、JDK10 中含有垃圾收集器的可视化工具。在 JDK 安装目录的 bin 中 jmc.exe

JDK11


Lambda 中使用 var

Consumer<String> consumer = (var t) ->System.out.println(t.toUpperCase());

字符串 API 增强

自 JDK9 和 JDK10 都为 java 增加了许多的 API,如今 JDK11 又增加了许多字符串自带方法,如下

/**

* 局部变量var

*/

public static void jdk11String() {

    String str = "xiaofei ";

    // 判断字符串是空白

    boolean isblank = str.isBlank();

    // 判断字符串是否为空

    boolean isempty = str.isEmpty();

    // 首位空白

    String  result1 = str.strip();

    // 去除尾部空白

    String  result2 = str.stripTrailing();

    // 去除首部空白

    String  result3 = str.stripLeading();

    // 复制几遍字符串

    String  copyStr = str.repeat(2);

    // 行数统计

    long  lineCount = str.lines().count();



    System.out.println(isblank);

    System.out.println(isempty);

    System.out.println(result1);

    System.out.println(result2);

    System.out.println(result3);

    System.out.println(copyStr);

    System.out.println(lineCount);

}

结果:

false

false

xiaofei

xiaofei

xiaofei // 这里有空格

xiaofei xiaofei 




Process finished with exit code 0

javac + java 命令合并

以前编译一个 java 文件时,需要先 javac 编译为 class,然后再用 java 执行,现在可以放到一起执行了。

$ java HelloWorld.java

Hello Java 11!

JDK12

Switch 表达式(预览版)

Switch 优化

/**

* Switch优化

*/

public static void jdk12Switch() {

    var day = 1;

    switch (day) {

    case 1, 2, 3 -> System.out.println(1);

    case 6 -> System.out.println(2);

    case 10, 11 -> System.out.println(3);

    case 20 -> System.out.println(4);

    }

}

instanceof + 类型强转

/**

* instanceof

*/

public static void jdk12Instanceofh() {

    Object obj = "XiaoFei";

    // jdk12之前

    if (obj instanceof String) {

        String s = (String) obj;

        int length = s.length();

        System.out.println(length);

    }

    // jdk12之后

    if (obj instanceof String str) {

        int length = str.length();

        System.out.println(length);

    }

}

JDK13


switch 优化更新(预览版)

Switch 优化

JAVA 12 中虽然增强了 swtich 语法,但并不能在 -> 之后写复杂的逻辑,JAVA 13 带来了 swtich 可以直接返回信息到变量上面。

/**

* Switch优化

*/

public static void jdk13Switch() {

    int k = 2;

    String result = switch (k) {

    case  1 -> "one";

    case  2 -> "two";

    default -> "many";

    };

    System.out.println(result);

}

Switch 优化

Java 13 开始,文本块可用作预览功能。它们以三个双引号(”””)开头。

/**

* 文本块升级

*/

public static void jdk13Text() {

    // jdk13之前

    String html1 = "\n" +

    "    \n" +

    "        

Hello, world

\n"
+ " \n" + "\n"; // jdk13之后 String html2 = """

Hello, world

"""
; }

JDK14


1、Switch(最终版)
2、垃圾回收器(更新优化)
3、Record(预览功能)
4、instanceof 的模式匹配(预览版)
5、jpackage 打包 (预览版)

新增 Record

使用它可以替代构造器、equal 方法、toString 方法,hashCode 方法。

public record Person(String name, int age) {}

新增 Record

新增 jpackage 打包工具,直接打包二进制程序,再也不用装 JRE 了!

JDK15


1、jpackage 打包 (预览版)
2、文本块(最终版)
3、Record(第二预览版)
4、Sealed 类(第一预览版)

支持 Unicode 13.0

此版本将 Unicode 支持升级到 13.0,增加了 13.0 5930 个字符,总共 143859 个字符类支持 Unicode 字符数据库,以及 55 个新表情符号字符。

封闭 Sealed 类

sealed 可以定义哪些其他类或接口可以扩展或实现当前类。

JDK16


1、Record(最终版)
2、密封类(第二预览版)
3、jpackage 打包 (最终版)

Stream 新增 toList 方法

.collect(Collectors.toList());

.toList();

JDK17


Realed class 密封类(最终版)

随机数增强

新加了一个类: RandomSupport, 又一个 3000 行的 Java 文件。

var random = RandomGenerator.of("L32X64MixRandom");

for (int i = 0; i < 10; i++) {

    System.out.println(random.nextInt());

}

你可能感兴趣的:(java,java,开发语言)