Java17新特性及代碼示例:還在使用Java8? 這5個Java17新功能,你會喜歡的

SpringBoot3.0最低支持JDK17,各開源軟件正在全面擁抱JDK17.

2022年Java開發(fā)人員生產(chǎn)力報(bào)告中,有升級計(jì)劃的調(diào)查受訪者中,37%的人計(jì)劃在未來六個月內(nèi)升級到2021年9月份發(fā)布的LTS版本JDK 17。另有25%的人計(jì)劃在未來6到12個月內(nèi)升級到JDK 17。

這5個你喜歡的JDK17新功能,會讓你升級JDK17嗎?

1. record 類 (記錄類)

傳統(tǒng)的Java應(yīng)用程序通過創(chuàng)建一個類,通過該類的構(gòu)造方法實(shí)例化類,并通過getter和setter方法訪問成員變量或者設(shè)置成員變量的值。有了record關(guān)鍵字,你的代碼會變得更加簡潔。

package cn.dayangshuo;

/**
 * 普通的dto
 * @author DAYANG
 */
public class NormalEntity {
    public static void main(String[] args) {
        //傳統(tǒng)的方式
        User1 user1 = new User1("大陽", 1990);
        System.out.println(user1);
        //reocrd 記錄類
        User2 user2 = new User2("大陽", 1990);
        System.out.println(user2);
    }
}

/**
 * 成員變量都是固定的
 */
class User1 {
    String name;
    Integer age;
    public User1(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User1[" +
                "name='" + name + '\'' +
                ", age=" + age +
                ']';
    }
}

package cn.dayangshuo;
/**
 * record 記錄類
 * 你也可以覆寫equals() hashCode() toString()方法
 * @author DAYANG
 */
record User2(String name, Integer age) {
    @Override
    public String toString() {
        return "User2[" +
                "name='" + name + '\'' +
                ", age=" + age +
                ']';
    }
    @Override
    public boolean equals(Object obj) {
        return false;
    }
    @Override
    public int hashCode() {
        return 0;
    }
}

2. 新的字符串方法

從JDK8到JDK17陸續(xù)增加了更多字符串方法,操作字符串更簡單了。

  • isBlank():如果字符串為空或字符串僅包含空格(包括制表符),則返回 true。注意與isEmpty() 不同,isEmpty()僅在長度為 0 時(shí)返回 true。
  • lines():將字符串拆分為字符串流,每個字符串包含一行。
  • strip() : 分別從開頭和結(jié)尾;
  • stripLeading()/stripTrailing()僅開始和僅結(jié)束刪除空格。
  • repeat(int times):返回一個字符串,該字符串采用原始字符串并按指定的次數(shù)重復(fù)該字符串。
  • readString():允許從文件路徑直接讀取到字符串。
  • writeString(Path path):將字符串直接寫入指定路徑處的文件。
  • indent(int level):縮進(jìn)字符串的指定量。負(fù)值只會影響前導(dǎo)空格。
  • transform(Function f):將給定的 lambda 應(yīng)用于字符串。
package cn.dayangshuo;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;
/**
 * @author DAYANG
 */
public class NewStringMethod {
    public static void main(String[] args) throws IOException {
        //lines()方法示例
        String str = "hello \njava17 \n\r!\r";
        Stream<String> lines = str.lines();
        lines.forEach(System.out::println);
        //readString()方法示例
        Path path = Path.of("C:\\NewStringMethod.java");
        String text = Files.readString(path);
        System.out.println(text);
    }
}

3. 清爽的switch表達(dá)式

上代碼:

package cn.dayangshuo;

/**
 * @author DAYANG
 */
public class OldSwitch {
    public static void main(String[] args) {
        oldSwitch();
        newSwitch();
    }
    
    private static void oldSwitch() {
        int size = 3;
        String cn = "";
        switch (size) {
            case 1:
                cn = "壹";
                break;
            case 2:
                cn = "貳";
                break;
            case 3:
                cn = "叁";
                break;
            default:
                cn = "未知";
        }
        System.out.println(cn);
    }
    //更清爽
    private static void newSwitch() {
        int size = 3;
        String cn = switch (size) {
            case 1 -> "壹";
            case 2 -> "貳";
            case 3 -> "叁";
            default -> "未知";
        };
        System.out.println(cn);
    }
}

4. 文本塊

Java處理json或者xml文本時(shí),需要多個繁瑣的嵌套轉(zhuǎn)義,代碼寫著費(fèi)勁,維護(hù)更費(fèi)勁。從Java13開始引入了文本塊(Text blocks),上代碼:

package cn.dayangshuo;

/**
 * @author DAYANG
 */
public class TextBlocks {
    public static void main(String[] args) {
        //需要轉(zhuǎn)義
        String jsonStr = "{\"name\": \"大陽\"}";
        //文本塊,不需要轉(zhuǎn)義字符
        String textBlocks = """
                {"name": "大陽"}
                """;
        System.out.println(jsonStr);
        System.out.println(textBlocks);
    }
}

5. 密封類(Sealed classes)

package cn.dayangshuo;

/**
 * 定義一個抽象密封類Pet,它的實(shí)現(xiàn)類只能是Dog, Cat這兩個,其他的實(shí)現(xiàn)類均不允許
 * @author DAYANG
 */
public abstract sealed class Pet
    permits Dog, Cat {}

final class Dog extends Pet {
}

final class Cat extends Pet {
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容