Java 21 是 Java 语言的一次重要更新,引入了若干新的特性,提升了开发者的编程效率和代码质量。本文将详细介绍 Java 21 的新特性,包括基础概念、使用方法、常见实践以及最佳实践。

简介

随着 Java 语言的不断演进,Java 21 在语法、性能和并发模型上进行了多方面的改进。此次更新强调了代码可读性和简洁性,同时提升了并行编程的能力。新的特性帮助开发者更好地应用现代编程理念。

Java 21 新特性概览

Java 21 带来了一系列增强功能,包括但不限于:

  1. 模式匹配增强
  2. 密封类扩展
  3. 记录模式
  4. 结构化并发
  5. 虚拟线程

模式匹配增强

模式匹配在 Java 中越来越重要,这一模式使得 Java 语言的表达能力得到了极大增强。Java 21 中,模式匹配不仅限于 instanceof,还包括 switch 表达式的新能力。

Object obj = getObject();
switch (obj) {
case Integer i -> System.out.println("Integer: " + i);
case String s -> System.out.println("String: " + s);
default -> System.out.println("Unknown type");
}

可以通过switch表达式来进行简化。将冒号(:)替换为箭头(->),并且switch表达式默认不会失败,所以不需要break。

private static void withSwitchExpression(Fruit fruit) {
switch (fruit) {
case APPLE, PEAR -> System.out.println("普通水果");
case MANGO, AVOCADO -> System.out.println("进口水果");
default -> System.out.println("未知水果");
}
}

switch表达式也可以返回一个值,比如上面的例子我们可以让switch返回一个字符串来表示我们要打印的文本。需要注意在switch语句的最后要加一个分号。


private static void withReturnValue(Fruit fruit) {
String text = switch (fruit) {
case APPLE, PEAR -> "普通水果";
case MANGO, AVOCADO -> "进口水果";
default -> "未知水果";
};
System.out.println(text);
}

也可以直接省略赋值动作直接打印。

private static void withReturnValue(Fruit fruit) {
System.out.println(switch (fruit) {
case APPLE, PEAR -> "普通水果";
case MANGO, AVOCADO -> "进口水果";
default -> "未知水果";
});
}

如果你想在case里想做不止一件事,比如在返回之前先进行一些计算或者打印操作,可以通过大括号来作为case块,最后的返回值使用关键字yield进行返回。

private static void withYield(Fruit fruit) {
String text = switch (fruit) {
case APPLE, PEAR -> {
System.out.println("给的水果是: " + fruit);
yield "普通水果";
}
case MANGO, AVOCADO -> "进口水果";
default -> "未知水果";
};
System.out.println(text);
}

当然也可以直接使用yield返回结果。

private static void oldStyleWithYield(Fruit fruit) {
System.out.println(switch (fruit) {
case APPLE, PEAR:
yield "普通水果";
case MANGO, AVOCADO:
yield "进口水果";
default:
yield "未知水果";
});
}

使用方法

引入的模式匹配允许在 switch 语句中进行更加复杂的匹配和操作。写法简洁,提高可读性。

常见实践

配合使用模式匹配,通常可用于解析复杂对象结构,增强代码灵活性。

最佳实践

  • 使用模式匹配替代多重 if-else 判断,及声明break 返回。
  • 避免过于深层嵌套。

密封类扩展

密封类在 Java 21 中得到了更多的支持,允许开发者精细控制继承结构。

public sealed class Shape permits Circle, Rectangle {
//...
}
public final class Circle extends Shape {
//...
}

使用方法

密封类允许在类声明中明确指定哪些子类可以继承它,有助于控制类的层次结构。

常见实践

适用于需要对子类集合做严格控制的业务场景,如几何形状、语法树等高级结构。

最佳实践

  • 搭配 sealednon-sealedfinal 关键字使用,增强类层次结构的可读性。
  • 定义清晰、稳定的子类集合。

记录模式

记录模式提供了一种简洁定义不变数据携带类的方式,并且支持用于模式解析。

record Point(int x, int y) {}

Point p = new Point(3, 4);
System.out.println("Point: " + p.x() + ", " + p.y());

使用方法

记录类自动生成了所有字段的访问器、equals()、hashCode()、toString() 方法,无需手动定义。

常见实践

用于数据传递的简单对象存储,避免重复代码。

最佳实践

  • 适用于需要不可变数据的情况。
  • 记录类字段应尽量设计为私有和最终,保持其不可变特性。

结构化并发

Java 21 引入了结构化并发,简化复杂的并发结构,提高代码的可维护性。

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
Future<Integer> future1 = executor.submit(() -> heavyComputation1());
Future<Integer> future2 = executor.submit(() -> heavyComputation2()); Integer result1 = future1.get();
Integer result2 = future2.get();
System.out.println("Results: " + result1 + ", " + result2);
}

使用方法

通过结构化并发,开发者能够在一个上下文内启动、管理和终结多个并发任务。

常见实践

应用于需要并发执行的任务处理,如并行数据处理和批量计算。

最佳实践

  • 合理设计并发边界,确保线程资源有效分配和回收。
  • 利用 try-with-resources 保证合集的自动关闭。

虚拟线程

虚拟线程是 Java 21 带来的革命性进展,允许大规模的轻量级线程操作,超越传统线程的限制。

Thread.startVirtualThread(() -> {
System.out.println("Running in a virtual thread");
});

使用方法

虚拟线程通过 Thread.startVirtualThread 创建,能够高效处理 I/O 密集型应用。

常见实践

特别适用于高并发、 I/O 重的应用场景,如 web 服务器请求。

最佳实践

  • 使用虚拟线程作为默认并发模型,减少阻塞操作。
  • 组合使用结构化并发,进一步强化模型的灵活性。

小结

Java 21 为开发者提供了众多新特性,从语言结构到并发模型,提升了开发的效率和代码的简洁性。通过学习这些新特性,开发者能编写更具表现力和可维护性的代码,同时应根据具体需求合理选择应用场景。

参考资料

Java 21 新特性的更多相关文章

  1. Java 8新特性探究(八)精简的JRE详解

    http://www.importnew.com/14926.html     首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 ...

  2. Java 8新特性之旅:使用Stream API处理集合

    在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda ...

  3. [转帖]Java 8新特性探究(八)精简的JRE详解

    Java 8新特性探究(八)精简的JRE详解 https://my.oschina.net/benhaile/blog/211804 精简版的api   撸了今年阿里.网易和美团的面试,我有一个重要发 ...

  4. IBM Developer:Java 9 新特性概述

    Author: 成富 Date: Dec 28, 2017 Category: IBM-Developer (20) Tags: Java (27) 原文地址:https://www.ibm.com/ ...

  5. Java 8 新特性——检视阅读

    Java 8 新特性--检视阅读 参考 Java 8 新特性--菜鸟 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的 ...

  6. Java 8 新特性——实践篇

    Java 8 新特性--实践篇 参考 Java8新特性 重要更新:Lambda 表达式和Stream API Lambda 表达式 Lambda 表达式引入之前: 举个场景例子:当我们要对一个班级里的 ...

  7. Java 8新特性-4 方法引用

    对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法     ClassName :: staticMetho ...

  8. Spring 4支持的Java 8新特性一览

    有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览S ...

  9. java 8 新特性

    最近在IDEA的️驱使下,看了点java8的东西,链接贴一下,,,,, 1.Java 8新特性概述2.Java 8中的 Stream API 详解[3.Java 8新特性终极指南] 简单的使用看完新特 ...

  10. Java 8 新特性终极版

    声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己 ...

随机推荐

  1. 手撸原生js放大镜效果

    普及知识:放大镜特效涉及到的几个值 offsetWidth    获取元素的宽度offsetHeight  获取元素的高度offsetLeft父元素没有定位时,获取元素距离页面的左边距,父元素有定位时 ...

  2. 工具推荐 | Xshell全版本解密工具(包括Xshell7)——SharpXDecrypt

    声明 本程序仅供个人恢复密码使用! 用户滥用造成的一切后果与作者无关! 使用者请务必遵守当地法律! 本程序不得用于商业用途,仅限学习交流! 请在下载后24小时内删除!如果代码中存在侵权行为,请联系我们 ...

  3. 【异步编程实战】如何实现超时功能(以CompletableFuture为例)

    [异步编程实战]如何实现超时功能(以CompletableFuture为例) 由于网络波动或者连接节点下线等种种问题,对于大多数网络异步任务的执行通常会进行超时限制,在异步编程中是一个常见的问题.本文 ...

  4. flutter3-dymall仿抖音直播商城|Flutter3.27短视频+直播+聊天App实例

    自研flutter3.27+dart3.6+getx实战抖音短视频+聊天+直播电商带货app商城应用. flutter_dymall一款基于最新版Flutter3.27+Dart3.x+Getx+me ...

  5. OpenStack基本介绍

    本文分享自天翼云开发者社区<OpenStack基本介绍>,作者:m****n 基本介绍 OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作.OpenSt ...

  6. Lucas 定理证明与扩展

    Lucas 定理及其证明.扩展 \[\binom{n}{m}\equiv\binom{n/p}{m/p}\binom{n\bmod p}{m\bmod p}\pmod p,\text{where}\ ...

  7. Codeforces 1536B Prinzessin der Verurteilung 题解 [ 紫 ] [ 后缀自动机 ] [ 动态规划 ] [ 拓扑排序 ]

    Prinzessin der Verurteilung:最短未出现字符串的板子. 思路 考虑在 SAM 上 dp,定义 \(dp_i\) 表示从 \(i\) 节点走到 NULL 节点所花费的最少步数. ...

  8. 8款支持 C# 语言的 AI 辅助编程神器,高效编程利器!

    前言 在当今这个AI技术日新月异的时代,一股创新的浪潮正席卷着软件开发领域,其中AI辅助编程工具以其独特的魅力脱颖而出,成为了众多开发者不可或缺的得力助手.这些工具不仅能够显著提升开发效率,优化代码质 ...

  9. 洛谷B4038 [GESP202409 三级] 平衡序列 题解

    原题传送门 前言 当我以一种十分激动的心情参加了GESP的2024-9的三级考试时. 打开了此题,然后--自以为是的拿着暴力一顿乱写!然后TLE. 直到结束我还是没有想出来! (太菜了!!!) 以一种 ...

  10. el-radio-group初始化默认值后点击无法切换问题/vue中设置表单对象属性页面不同步问题

    <el-radio-group v-model="ruleForm.type"> <el-radio :label="1">方案一< ...