Java17和Java8的比较

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

(完)

发表评论

邮箱地址不会被公开。 必填项已用*标注