Java9-17新特性总结

简介: Java9-17新特性总结

年底即将发布的SpringBoot3.0最低支持Java17版本

这里记录下新语法和值得注意的库

语法特性

module

JDK9模块系统

Java 9 模块的重要特征是在其工件的根目录中包含了一个描述模块的 module-info.java 文 件通过exports向外开放接口/类, 限定模块使用范围同时通过requires定义该模块所需依赖

module com.mycompany.sample {
exports com.mycompany.sample;
requires com.mycompany.common;
provides com.mycompany.common.DemoService with
    com.mycompany.sample.DemoServiceImpl;
}

复制

Try-with-resources 允许有效地使用最终变量

JDK9java9之前

FileInputStream fis = new FileInputStream("test");
//编译失败
try (fis) {
}
//只允许这样
try (FileInputStream fis = new FileInputStream("test")) {
}

复制

java9之后

FileInputStream fis = new FileInputStream("test");
try (fis) {
}

复制

接口的私有方法

JDK9

interface ITest {
//必须有方法体
    private void test () {
    }
}

复制

匿名内部类泛型

JDK9

interface Foo<T> {
    void test(T t);
}
//java9之前编译失败
Foo<String> f = new Foo<>() {
    // test()方法的参数类型为String
    public void test(String t) {
        System.out.println("test 方法的 t 参数为:" + t);
    }
};

复制

类型推断

JDK10JDK11增强使用var进行类型推断的变量必须进行初始化JDK10

var str = "sss";
var map = new HashMap<String, String>();
for (var s : list) {
}

复制

JDK11加入了对lambda参数的支持

//JDK10
IntFunction<Integer> integerIntFunction = (int t) -> t / 2;
//JDK11
IntFunction<Integer> integerIntFunction2 = (var t) -> t / 2;

复制

Switch 表达式扩展

JDK14JDK12/13预览

int numLetters = switch (day) {
    //分支可以并列 使用 箭头可以直接返回一个值
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    default      -> {
      String s = day.toString();
      int result = s.length();
      //使用 yield 关键字返回一个值, 并退出switch代码块
      yield result;
    }
};

复制

更友好的空指针异常信息

JDK15JDK14预览

a.b.c.i = 99;

复制

console

Exception in thread "main" java.lang.NullPointerException:

Cannot read field "c" because "a.b" is null

复制

文本块

JDK15JDK13/14预览

\:行终止符,主要用于阻止插入换行符

\s:表示一个空格。可以用来避免末尾的白字符被去掉。

String html = """
        <html> \
            <body> \s
                <p>Hello, world</p>
            </body>
        </html>
        """;

复制

instanceof 模式匹配

JDK16JDK14/15预览

//jdk 14之前
if (object instanceof Kid) {
Kid kid = (Kid) object;
// ...
} else if (object instanceof Kiddle) {
Kid kid = (Kid) object;
// ...
}

复制

//jdk 14+
if (object instanceof Kid kid) {
// ...
} else if (object instanceof Kiddle kiddle) {
// ...
}
//注意,如果 if 条件中有 && 运算符时,当 instanceof 类型匹配成功,模式局部变量的作用范围也可以相应延长
//并不适用于或 || 运算符. 如下面代码:
if (obj instanceof String s && s.length() > 5) {
    System.out.println("obj is a String with more than 5 characters: " + s.toUpperCase());
}

复制

Record 类型

功能类似lombok的@Data吧

但是record类型内的字段为final类型, 只能在构造方法内初始化, 且只提供对应字段的get方法, 场景有限

JDK16JDK14/15预览

record Point(int x, int y) { }
var point = new Point(1, 2);
point.x(); // returns 1
point.y(); // returns 2

复制

密封类

可以限制哪些其他类可以继承或实现它们

JDK17JDK15/16预览

// 添加sealed修饰符,permits后面跟上只能被继承的子类名称
public sealed class Person permits Teacher, Worker, Student{ } //人
// 子类可以被修饰为 final
final class Teacher extends Person { }//教师
// 子类可以被修饰为 non-sealed,此时 Worker类就成了普通类,谁都可以继承它
non-sealed class Worker extends Person { }  //工人
// 任何类都可以继承Worker
class AnyClass extends Worker{}
//子类可以被修饰为 sealed,同上
sealed class Student extends Person permits MiddleSchoolStudent,GraduateStudent{ } //学生
final class MiddleSchoolStudent extends Student { }  //中学生
final class GraduateStudent extends Student { }  //研究生

复制

Switch 模式匹配

JDK17预览

String formatterPatternSwitch(Object o) {
    return switch (o) {
        //甚至能判断null
        case null -> "null";
        // 如果对象是Integer类型 就转换为 Integer类型 和 instanceof 模式匹配很像, 相当于和Switch进行整合了
        case Integer i -> String.format("int %d", i);
        case Long l -> String.format("long %d", l);
        case Double d -> String.format("double %f", d);
        case String s -> String.format("String %s", s);
        default -> o.getClass().getSimpleName() + " " + o;
    };
}

复制

API特性

仅列出值得关注的一些特性

JDK9

  1. 集合上,Java 9 增加 了 List.of()、Set.of()、Map.of() 和 Map.ofEntries()等工厂方法来创建不可变集合. Stream 中增加了新的方法 ofNullable、dropWhile、takeWhile 和 iterate . Collectors 中增加了新的方法 filtering 和 flatMapping
  2. Java 9 增加了 ProcessHandle 接口,可以对原生进程进行管理
  3. 变量句柄, 增强方法句柄
  4. I/O 流新特性 readAllBytes/readNBytes/transferTo
  5. Arrays.mismatch 找到两个数组之间的第一个不匹配元素

JDK11

  1. 飞行记录器
  2. 使用默认类数据共享(CDS)存档 减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用
  3. 字符串增强,如isBlank/lines/repeatstrip
  4. HttpClient

JDK12

  1. 字符串增强,indent和transform
  2. Files.mismatch 找到两个数组之间的第一个不匹配的字节
  3. Collectors.teeing

JDK13

  1. Socket API 重构

JDK14

  1. @Serial : 与@Override类似,此注解与-Xlint结合使用,以对类的与序列化相关的成员执行编译时检查。

JDK15

  1. 隐藏类

JDK16

  1. Stream.toList

REF

https://advancedweb.hu/a-categorized-list-of-all-java-and-jvm-features-since-jdk-8-to-18


目录
相关文章
|
2月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
78 2
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
48 3
|
2月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
38 2
|
2月前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
36 3
|
2月前
|
安全 Java API
Java 17新特性让你的代码起飞!
【10月更文挑战第4天】自Java 8发布以来,Java语言经历了多次重大更新,每一次都引入了令人兴奋的新特性,极大地提升了开发效率和代码质量。本文将带你从Java 8一路走到Java 17,探索那些能让你的代码起飞的关键特性。
94 1
|
2月前
|
编解码 Oracle Java
java9到java17的新特性学习--github新项目
本文宣布了一个名为"JavaLearnNote"的新GitHub项目,该项目旨在帮助Java开发者深入理解和掌握从Java 9到Java 17的每个版本的关键新特性,并通过实战演示、社区支持和持续更新来促进学习。
91 3
|
15天前
|
存储 Java 开发者
什么是java的Compact Strings特性,什么情况下使用
Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。
|
24天前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
40 6
|
1月前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
35 4
|
2月前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
99 3