探索 Java 21 中令人兴奋的新功能:示例和见解
Java 21 特性及示例
本文全面概述了 JDK 21 中引入的新功能,这些新功能由 Java Community Process 中的 JSR 396 指定。从语言改进到性能优化,这些功能旨在提高 Java 开发的生产力、灵活性和效率。让我们深入了解细节并探索 JDK 21 中令人兴奋的进步。
1.字符串模板(预览版):
字符串模板计划作为 JDK 21 中的预览功能引入,旨在简化 Java 中字符串格式化和操作的过程。此功能使开发人员能够将表达式直接合并到字符串文字中,从而方便复杂字符串的创建和格式化。在下面的博客文章中,我们将深入探讨字符串模板的概念,提供实用的说明,帮助 Java 开发人员接受和利用这一强大附加功能的功能。
让我们探索一个不同的示例来展示字符串模板在执行高级格式化方面的强大功能。考虑一个场景,您想要显示产品的信息,包括其名称、价格和可用性状态。传统上,您可以使用运算符连接多个字符串+:
// Java 21 之前的 String productName="Widget"; double productPrice=29.99; boolean productAvailable=true; String productInfo="Product: " + productName + "\nPrice: $" + productPrice + "\nAvailability: " + (productAvailable ? "In Stock" : "Out of Stock"); System.out.println(productInfo);
使用字符串模板,您可以简化格式化过程并使代码更具可读性:
// 从 Java 21 开始 String productName = "Widget"; double productPrice = 29.99; boolean productAvailable = true; String productInfo = `Product: ${productName} Price: $${productPrice} Availability: ${productAvailable ? "In Stock" : "Out of Stock"}`; System.out.println(productInfo);
在此示例中,我们使用字符串模板将变量productName、productPrice、 和productAvailable直接嵌入字符串文字中。表达式包含在其中${},并且可以包含其他格式,例如在 之前添加美元符号productPrice。生成的字符串更简洁、更易于阅读,并且无需显式连接和格式化操作。
2. Sequenced Collections
在 JDK 21 中,Sequenced Collections 的引入带来了新的接口和方法来简化和简化集合处理。此增强功能旨在解决访问 Java 中各种集合类型的第一个和最后一个元素需要非统一且有时很麻烦的方法的常见场景。本文通过不同集合处理场景的示例探讨了顺序集合功能及其优点。
Sequenced Collections 接口
Sequenced Collections 引入了三个新接口:SequencedSet、SequencedCollection 和 SequencedMap。这些接口附带了其他方法,可以提供改进的集合访问和操作功能。
访问第一个和最后一个元素
在 JDK 21 之前,在 Java 中检索集合的第一个和最后一个元素涉及不同的方法和途径,具体取决于集合类型。让我们看一下使用 JDK 21 之前的 JDK API 调用访问第一个和最后一个元素的一些示例:
对于list
第一个元素 — list.get(0)
最后一个元素 — list.get(list.size()-1)
对于 Deque
第一个元素 — deque.getFirst()
最后一个元素 — deque.getLast()
对于 Set
第一个元素 — set.iterator().next() 或 set.stream().findFirst().get()
最后一个元素 — 需要迭代集合
对于 SortedSet
第一个元素 — set.first()
最后一个元素 — set.last()
随着 JDK 21 和顺序集合功能的引入,访问第一个和最后一个元素变得更加一致和直接。新方法简化了不同集合类型的流程:
对于列表、双端队列、设置
第一个元素 — collection.getFirst()
最后一个元素 — collection.getLast()
3. 记录模式使用
记录模式来解构记录值,从而增强 Java 编程语言。记录模式和类型模式可以嵌套,以实现强大的、声明性的、可组合形式的数据导航和处理。
模式匹配和记录
// 从 Java 16 开始, record Point ( int x, int y) {} static void printSum (Object obj) { if (obj instanceof Point p) { int x = px(); int y = py(); System.out.println(x+y); } }
此处的模式变量p仅用于调用访问器方法x()和y(),该方法返回组件x和的值y。(在每个记录类中,其访问器方法与其组件之间都存在一一对应的关系。)如果该模式不仅能够测试某个值是否是 的实例,而且还能够从该值中提取 和 组件,那就Point更好x了y直接代表我们调用访问器方法。换句话说:
// 从 Java 21 开始 static void printSum (Object obj) { if (obj instanceof Point ( int x, int y) ) { System.out.println(x+y); } }
4. switch 的模式匹配
switch通过表达式和语句的模式匹配增强 Java 编程语言。扩展模式匹配switch允许针对多个模式测试表达式,每个模式都有一个特定的操作,以便可以简洁、安全地表达复杂的面向数据的查询。
// Java 21 之前的 static String formatter(Object obj) { Stringformatted="unknown"; if (obj instanceof Integer i) { formatted = String.format("int %d", i); } elseif (obj instanceof Long l) { formatted = String.format("long %d", l); } elseif (obj instanceof Double d) { formatted = String.format("double %f", d); } elseif (obj instanceof String s) { formatted = String.format("String %s", s); } return formatted; }
但switch是一个完美的匹配模式!如果我们扩展switch语句和表达式以适用于任何类型,并允许case使用模式标签而不仅仅是常量,那么我们可以更清晰可靠地重写上面的代码:
// 从 Java 21 开始 static String formatterPatternSwitch(Object obj) { returnswitch (obj) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> obj.toString(); }; }
总结:
总而言之,jdk21的新特性还是非常令人期待的,有心动的吗,心动的话就赶紧升级jdk21吧,如果你要升级,那就直接跳过jdk11和jdk17,建议直接选择jdk21,因为实在是太香了