这里介绍相比于JDK8,JDK 17中支持、提供的新特性
Record 记录类
JDK17中新增一种特殊的类——Record 记录类,用于表示不可变的数据。Record类会自动生成、提供 全参构造器(按属性声明顺序的构造器)、与成员变量同名的访问器方法(getter方法)、equals()、hashCode()、toString()方法。该类适用于dto传输数据的场景,在功能上非常类似于Python的具名元组。记录类的不可变性的体现在:
- 所有成员变量都是final。成员变量一旦通过构造器完成初始化后就不能被修改。故对于记录类而言,不存在成员变量的修改器方法(setter方法)
- Record类是隐式的final类。故不能有抽象方法、不可被继承并派生子类
Record类支持的行为:
- Compact Constructor紧凑构造器:用来定义调用全参构造器时的前置行为。语法上类似构造器,但没有参数列表。常用于参数校验、初始化初始化成员变量
- 重载版本的构造器:由于Record类会自动生成一个全参的构造器。故我们也可以定义其他重载版本的构造器
- 静态方法:可定义静态方法。常用作工具方法、工厂方法
1 | public record PersonInfo( |
Text Blocks 文本块
JDK17在处理多行字符串方面引入了新特性Text Blocks文本块。该特性使得定义JSON字符串会更简单方便。开始的 “”” 后必须要换行,否则编译失败;结束的 “”” 可以直接写在最后一个字符后,此时文本的最后没有换行符;如果结束的 “”” 单独一行,则文本最后有换行符
1 | public class TextBlocksTest { |
Switch 表达式增强
JDK17中对switch表达式进行了增强:
- 允许switch表达式有返回值,这样就可以将表达式的结果直接赋值给一个变量
- 支持箭头语法。即将:冒号替换为->箭头。该语法不仅可以实现一个case中匹配多个值;且不会引发穿透,故无需使用break语句
- 支持yield关键字。当case块后有多条语句,可使用yield关键字来返回值(相当于return)
1 | public class SwitchTest { |
instanceof 增强
instanceof 得到增强。将类型判断、变量赋值合并为一步完成。在类型判断后可直接声明类型转换后的变量名,然后直接使用该变量名。无需手动强转
1 | public class InstanceOfTest { |
Stream API增强
Stream从JDK 9开始提供了下述新API
- takeWhile方法:该方法返回一个流。其会获取满足谓词条件的元素,直到遇到第一个不满足谓词条件的元素后停止获取
- dropWhile方法:该方法返回一个流。其会丢弃满足谓词条件的元素,直到遇到第一个不满足谓词条件的元素后停止丢弃
- ofNullable方法:如果提供的元素为null,则返回一个空流。这样无需判空,避免发生NPE
1 | import org.apache.commons.lang3.StringUtils; |
Optional API增强
Optional从JDK 9开始提供了下述新API
- stream方法:该方法用于将optional对象转换为stream流。如果optional中的值不为null,则返回一个包含该值的stream流;如果optional中的值为null,则返回一个空流
- ifPresentOrElse方法:该方法提供了一种条件执行逻辑。其会在optional中的值不为null时执行一个操作;而在optional中的值为null时执行另一个操作。显然相比较于ifPresent方法,该方法更加灵活
1 | import java.util.Arrays; |