Java17和Java8的比较
Java17发布了,是一个LST版本,和Java8比较,带来了一些新特性,整理如下:
new var 关键字
// java 8
Map<String, List<MyDtoType>> myMap = new HashMap<String, List<MyDtoType>>();
List<MyDomainObjectWithLongName> myList = aDelegate.fetchDomainObjects();
// java 10
var myMap = new HashMap<String, List<MyDtoType>>();
var myList = aDelegate.fetchDomainObjects()
Record 值类型
从 Java14(14、15预览,16正式)之后,可以使用 record 定义不可变数据类,用于在类和应用程序之间的数据传输(DTO 类),通过构造函数创建对象,JVM 会自动生成 getter 方法供使用,有点类似于 Lombok 的作用。
区别是 Lombok 只是生成代码,而 record 类型的类附加了不可变且透明的语义,这既是优点也是缺点。Record 类不能存在任何隐藏状态,适用于作为标准化的类使用,不适合作为一个普通的 java bean 使用,更不用说代替 Lombok。
record BankAccount (String bankName, String accountNumber) implements HasAccountNumber {
}
record BankAccount (String bankName, String accountNumber) implements HasAccountNumber {
public BankAccount { // <-- this is the constructor! no () !
if (accountNumber == null || accountNumber.length() != 26) {
throw new ValidationException(“Account number invalid”);
}
// no assignment necessary here!
}
}
Switch 表达式
对 Switch 表达式进行了改进,比传统写法更简便,在 Java17 的预览版中,还支持对类型的匹配。
DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
boolean freeDay = switch (dayOfWeek) {
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> false;
case SATURDAY, SUNDAY -> true;
};
sealed 修饰封闭类
在一般情况,如果一个类没有被 final 关键字修饰,那么其他类就可以继承该类。从 Java15(15、16预览,17正式) 开始,可以使用 sealed 修饰一个类或接口,并通过 permits 指定哪几个类可以从该类继承,继承的子类必须使用 final 或者 non-sealed 修饰。
public abstract sealed class Animal
permits Dog, Cat {
}
public final class Dog extends Animal {
}
public final class Cat extends Animal {
}
//如果想被继承的话用 non-sealed 修饰
non-sealed class Dog extends Animal {
@Override
void speak() {
System.out.println("bark bark bark...");
}
}
ChineseRuralDog extends Dog{
@Override
void speak() {
System.out.println("let me alone!");
}
}
文本块 text block
引入了文本块来解决多行文本的问题。
String myPoem = """
The Western is a genre of film and other fiction set primarily in the latter half of the 19th century or early 20th century in the Western United States, - \
commonly referred to as the "Old West" or the "Wild West".
"""
stream
Java 16 引入 Stream.toList() 可以更方便的添加集合方法,这可以取代以前的 .collect(Collectors.toList()) , 还有 Stream.mapMulti 方法,允许用多个元素替换流中的元素。
Better NullPointerExceptions
New HttpClient
New Optional.orElseThrow() method
其他API的变化,更好用的API
JVM 17 vs JVM 8 changes
- Project Jigsaw
- Garbage Collectors
- G1,ZGC,Shenandoah GC,No-Op Garbage Collector ..
- 容器更友好 docker
(完)