关于java:还在使用Java8-这5个Java17新功能你会喜欢的

2次阅读

共计 3000 个字符,预计需要花费 8 分钟才能阅读完成。

SpringBoot3.0 最低反对 JDK17,各开源软件正在全面拥抱 JDK17.

在 2022 年 Java 开发人员生产力报告中,有降级打算的考察受访者中,37% 的人打算在将来六个月内降级到 2021 年 9 月份公布的 LTS 版本 JDK 17。另有 25% 的人打算在将来 6 到 12 个月内降级到 JDK 17。

这 5 个你喜爱的 JDK17 新性能,会让你降级 JDK17 吗?

1. record 类(记录类)

传统的 Java 应用程序通过创立一个类,通过该类的构造方法实例化类,并通过 getter 和 setter 办法拜访成员变量或者设置成员变量的值。有了 record 关键字,你的代码会变得更加简洁。

package cn.dayangshuo;

/**
 * 一般的 dto
 * @author DAYANG
 */
public class NormalEntity {public static void main(String[] args) {
        // 传统的形式
        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 陆续减少了更多字符串办法,操作字符串更简略了。

  • isBlank():如果字符串为空或字符串仅蕴含空格(包含制表符),则返回 true。留神与 isEmpty() 不同,isEmpty() 仅在长度为 0 时返回 true。
  • lines():将字符串拆分为字符串流,每个字符串蕴含一行。
  • strip():别离从结尾和结尾;
  • stripLeading()/stripTrailing() 仅开始和仅完结删除空格。
  • repeat(int times):返回一个字符串,该字符串采纳原始字符串并按指定的次数反复该字符串。
  • readString():容许从文件门路间接读取到字符串。
  • writeString(Path path):将字符串间接写入指定门路处的文件。
  • indent(int level):缩进字符串的指定量。负值只会影响前导空格。
  • transform(Function f):将给定的 lambda 利用于字符串。
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 表达式

上代码:

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 文本时,须要多个繁琐的嵌套本义,代码写着吃力,保护更吃力。从 Java13 开始引入了文本块(Text blocks),上代码:

package cn.dayangshuo;

/**
 * @author DAYANG
 */
public class TextBlocks {public static void main(String[] args) {
        // 须要本义
        String jsonStr = "{\"name\": \" 大阳 \"}";
        // 文本块,不须要转义字符
        String textBlocks = """{"name":" 大阳 "}""";
        System.out.println(jsonStr);
        System.out.println(textBlocks);
    }
}

5. 密封类(Sealed classes)

package cn.dayangshuo;

/**
 * 定义一个形象密封类 Pet,它的实现类只能是 Dog, Cat 这两个,其余的实现类均不容许
 * @author DAYANG
 */
public abstract sealed class Pet
    permits Dog, Cat {}

final class Dog extends Pet {
}

final class Cat extends Pet {}
正文完
 0