java21新特性

java21新特性

2023年9月20日,Oracle公司宣布Java 21正式发布。该版本是继JDK 17之后最新的长期支持版本(LTS),将获得至少8年的支持!

Java 21 号称具有数千项性能、稳定性和安全性改进。新的 JDK 21 包括对 15 项改进的抢先体验,这些增强功能是在 Oracle CloudWorld 2023 会议上宣布的,包括支持虚拟线程以提高整体吞吐量,以及增加对向量应用编程接口(API)的支持,从而更轻松地构建涉及人工智能 AI 模型的 Java 应用。java 21官方下载地址:https://www.oracle.com/de/java/technologies/downloads/

字符串模板

在Java 21中处理字符串的新方法称为:Template Expressions,即:模版表达式。

主要包含三个部分:

  • 模版处理器:STR
  • 包含内嵌表达式(\{blog})的模版
  • 通过.把前面两部分组合起来,形式上类似方法调用

示例场景:

  1. 内嵌表达式中可以进行数学运算。
  2. 内嵌表达式中还可以调用方法。
  3. 内嵌表达式中还可以访问对象的成员变量。
 	  //模板表达式演示
    public void testTemplateExpressions(){
        String blog = "cnblogs.com/caohuajin";
        String str = STR."My blog is \{blog}";//调用字符串模板

        int x = 10;
        int y = 20;
        String result = STR."\{x} + \{y} = \{x + y}";//内嵌表达式数学运算

        String s = STR."My blog is \{getMyBlog()}";//调用getMyBlog方法

        User2 u = new User2("Mr.cao", "cnblogs.com/caohuajin"); // 构造函数参数为name属性和blog属性
        String user = STR."\{u.name}的博客地地址为:+ \{u.blog}";

        System.out.println(user);
    }
	   public String getMyBlog(){
        return "cnblogs.com/caohuajin";
    }
	  @Data
    public class User{
        String name;
        String blog;
        public User(String name, String blog){
            this.name = name;
            this.blog = blog;
        }
    }

记录模式

以前我们定义类都是用class关键词,但从Java 16开始,我们将多一个关键词record,它也可以用来定义类。record关键词的引入,主要是为了提供一种更为简洁、紧凑的final类的定义方式。替代lombok插件(Lombok并非Java官方提供),record类可以根据类的字段自动生成:构造函数、equals()、hashCode() 和 toString()。

record申明的类为了简化类的声明,具备这些特点:

  1. 它是一个final
  2. 自动实现equalshashCodetoString函数
  3. 成员变量均为public属性
 //record记录类
    public void testRange(){
        range r = new range(10, 20);
        System.out.println(r.distance());
    }

    record range(int start, int end){
         int distance(){
            return end - start;
        }
    }

有序集合

Sequenced Collectionsopen 引入了三个新接口:

  • SequencedCollection
  • SequencedMap
  • SequencedSet

对于ListSet这些有序的集合,访问方法变得统一起来:

  • 第一个元素:collection.getFirst()
  • 最后一个元素:collection.getLast()
  //有序集合
    public void testSortedSet(){
        ArrayList collection = new ArrayList();
        collection.getFirst();

        SortedSet sortedSet = new TreeSet();
        sortedSet.getFirst();

    }

switch模式匹配

简化Switch配置

  • java 16中的instance of增强对于instanceof的判断以及类型转换可以合二为一
Object value = data.get("key1");
if (value instanceof String s) {
  System.out.println(s.substring(1));
}
  • switch中使用Lambda的增强
    //switch匹配简化
    public void testSwitch() {
        Map<String, Object> data = new HashMap<>();
        data.put("key1", "value1");
        data.put("key1", 12.67);
      //  data.put("key1", 56);
        switch (data.get("key1")) {
            //instance of增强和switch中使用Lambda的增强
            case String s -> System.out.println(s);
            case Double d -> System.out.println(d.toString());
            case Integer i -> System.out.println(i.toString());
            default -> System.out.println("default");
        }
    }

虚拟线程

虚拟线程是一个新的轻量级 java.lang.Thread 变体,是 Project Loom 项目的一部分,不由操作系统管理或调度。相反由 JVM 负责调度。当然在实际工作反映到操作系统还是以平台线程运行,但 JVM 正是利用所谓的载体线程(即平台线程)来“承载”虚拟线程。

  • 虚拟线程是由JVM管理的轻量级线程。
  • 虚拟线程不需要任何显式分配或调度。
  • 虚拟线程非常适合I/O密集型任务或需要大量并行性的任务。
  • 虚拟线程也可以用来实现异步操作。
 //虚拟线程
    public void testVirtualThread()  {
        Runnable runnable = () -> {
            System.out.println("你好, 虚拟线程!");
            System.out.println(Thread.currentThread().getName());
        };

        // 使用静态构建器方法
        Thread virtualThread = Thread.startVirtualThread(runnable);

        // 使用静态工厂方法
        ThreadFactory virtualThreadFactory = Thread.ofVirtual()
                .name("myVirtual", 0)
                .factory();

        Thread factoryThread = virtualThreadFactory.newThread(runnable);
        factoryThread.start();

        // 结合ExecutorService方式
        try (ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor()) {
            for (int i = 1; i < 100; i++) {
                executorService.submit(runnable);
            }
        }
    }

StringBuilder和StringBuffer新增repeat方法

    //StringBuilder和StringBuffer的repeat方法演示
    public void testStringBuilder() {
        var sb = new StringBuilder().repeat("*", 10);
        System.out.println(sb);
    }

main方法简化

public class Main {
    void main() { //main方法简化
        Main main = new Main();
        main.testTemplateExpressions();
        main.testRange();
        main.testSwitch();
        main.testVirtualThread();
        main.testStringBuilder();
    }
		.......
}
posted @   曹化金  阅读(235)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
点击右上角即可分享
微信分享提示