Java17新特性及代码示例

  |   0 评论   |   0 浏览

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 {
 }

转自https://zhuanlan.zhihu.com/p/478416139


标题:Java17新特性及代码示例
作者:michael
地址:https://blog.junxworks.cn/articles/2022/12/02/1669972478556.html