Java 9-15 ,語法新特性彙總

環境說明

  • OpenJdk 15

  • 開發工具 IDEA 2020.3.2

var 類型推斷 | since jdk10

var 是 Java10 版本中新出的特性,用它來定義局部變量。var 不是關鍵字,至關於一種動態類型,編譯器根據變量所賦的值來推斷類型。因此必須在定義變量的時候賦初始值。java

@Test
 public void testJDK10VarLocalVariable(){
  var num1 = 1000;
  var num2 = 1.001;
  var str = "hello var";
  var list = new ArrayList<>();
  var map = new HashMap<>();
 }

 @Test
 public void testNoramlVariable(){
  int num1 = 1000;
  double num2 = 1.001;
  String str = "hello var";
  List list = new ArrayList<>();
  Map map = new HashMap();
 }

文本塊 | since jdk13

在咱們平常的工做中,有時候須要用到一大段的字符串,這些字符串須要換行,須要排版,須要轉義。在一個文本編輯器中,這固然是很是容易的事情。可是在 java 代碼中,就是一個噩夢了。而新的文本塊使用"""這個符號,進行拼接。編程

  • 簡化表達多行字符串,不須要轉義;
  • 加強可讀性;
@Test
 public void testNormalString(){
  String text = "{" + "\n"
    +"    \"username\": \"lengleng\",\n"
    +"    \"password\": \"123456\" \n"
    +"}";
  System.out.println(text);
 }

 @Test
 public void testNewJdk13TextBlock(){
  var text = """
               {
                    "username": "lengleng",
                    "password": "123456"
               }
               """;
  System.out.println(text);
 }

switch 表達式 | since jdk12

  • 以下邏輯,當咱們須要判斷某天是不是工做日時候,須要大量的重複的 case 邏輯
@Test
 public void testNormalSwitch() {
  int day = 2;
  switch (day) {
  case 1:
  case 2:
  case 3:
  case 4:
  case 5:
   System.out.println("workday");
  case 6:
  case 7:
   System.out.println("weekend");
  default:
   System.out.println("invalid");
  }
 }
  • jdk12 能夠經過的 switch 表達式簡化如上邏輯
    @Test
    public void testNewJdk12MultiSwitch() {
    var day = 2;
    switch (day) {
    case 1, 2, 3, 4, 5 -> System.out.println("workday");
    case 6, 7 -> System.out.println("weekend");
    default -> System.out.println("invalid");
    }
    }

集合工廠 | since jdk9

  • 一般但願在代碼中建立一個集合(例如,List 或 Set ),並直接用一些元素填充它。實例化集合,幾個 「add」 調用,使得代碼重複。
@Test
 public void testNormal(){
  List<String> fruitsTmp = new ArrayList<>();
  fruitsTmp.add("apple");
  fruitsTmp.add("banana");
  fruitsTmp.add("orange");


  Map<Integer, String> numbersTmp = new HashMap<>();
  numbersTmp.put(1, "one");
  numbersTmp.put(2, "two");
  numbersTmp.put(3, "three");
 }
  • 如今能夠經過 of 方法來快速構建集合類型
@Test
 public void testNewJdk9() {
  var fruits = List.of("apple", "banana", "orange");
  var numbers = Map.of(1, "one", 2, "two", 3, "three");
 }

record 記錄 | since jdk14

Records 的目標是擴展 Java 語言語法,Records 爲聲明類提供了一種緊湊的語法,用於建立一種類中是「字段,只是字段,除了字段什麼都沒有」的類。經過對類作這樣的聲明,編譯器能夠經過自動建立全部方法並讓全部字段參與 hashCode()等方法。幹掉 lombok 只須要經過 record 聲明便可完成實體字段的 get 和構造器方法。app

public record Demo(String username, String password) {

}
 @Test
 public void testJdk15Record() {
  var demo = new Demo("lengleng", "123456");
  System.out.println(demo.password());
  System.out.println(demo.username());
 }

接口私有方法 | since jdk9

Java8 帶來了許多改變,其中之一就是 default 修飾的接口方法。這些方法改變了咱們已知的接口,如今咱們可以在接口中定義默認實現方法。若是你大量使用 default 方法在你的應用接口中,如今能夠經過 JDK9 的接口私有方法來重構。編輯器

public interface PrivateInterface {

 private void printF(){
  System.out.println("lengleng");
 }

 default void getPassword(){
  printF();
  System.out.println("123456");
 }
}
 @Test
 public void testGetPassword() {
  var privateInterface = new PrivateInterfaceImpl();
  privateInterface.getPassword();
 }

Sealed 類封閉 | since jdk15

可擴展性不是面向對象編程的一個重要指標嗎?爲何要限制可擴展性呢?其實,面向對象編程的最佳實踐之一,就是要把可擴展性的限制在能夠預測和控制的範圍內,而不是無限的可擴展性。工具

  • 經過 sealed 定義接口或者抽象類
public sealed interface Pet permits Cat {
}
  • 分配權限的子類能夠正常的實現此接口開發工具

    public final class Cat implements Pet {
    }
  • 若沒有子類沒有分配權限,則編譯直接報錯

相關文章
相關標籤/搜索