JDK21新增特性

news/2024/11/19 21:13:16/文章来源:https://www.cnblogs.com/perfectLi/p/18545875

顺序集合(Sequenced Collections)

提供了几个新的接口,用于实现有序的集合。

在没有提供有序集合操作之前,我们进行集合的序列操作一般如下

First element Last element
List list.get(0) list.get(list.size() - 1)
Deque deque.getFirst() deque.getLast()
SortedSet sortedSet.first() sortedSet.last()
LinkedHashSet linkedHashSet.iterator().next() // missing

JDK新提供的几个接口:

  • SequencedCollection
  • SequencedSet
  • SequencedMap

集合的继承实现关系如下所示:

img

 public static void main(String[] args) {//    SequencedCollectionList<String> list = new ArrayList<>();list.reversed();list.getFirst();list.getLast();list.removeFirst();list.removeLast();//    SequencedSetLinkedHashSet<String> set = new LinkedHashSet<>();set.getFirst();set.getLast();set.reversed();TreeSet<String> treeSet = new TreeSet<>();treeSet.getFirst();treeSet.getLast();
//    treeSet.reversed();// SequencedMapLinkedHashMap<String, Object> map = new LinkedHashMap<>();map.firstEntry();map.lastEntry();map.reversed();map.putFirst("first",1);map.putLast("last","last");map.pollFirstEntry();map.pollLastEntry();}

记录模式(Record Patterns)

增强Java程序对record模式的记录值的解构
records模式和类型模式可以嵌套

目标:

  • 1.支持record类实例的结构,适配更多场景的数据查询
  • 2.增加嵌套类型,可以使用更多类型组合数据类型的查询

模式匹配和记录:

record类实例对于编码程序来说可以精确到数据的类型,并可以创建获取数据的可使用方法

  @Testpublic void testRecordInstance(){record Test1(String t1,String t2){}Test1 test1 = new Test1("1", "2");//Test1(String t1,String t2)是record模式,明确声明了本地变量的类型if(test1 instanceof Test1(String t1,String t2)){System.out.println(t1);System.out.println(t2);}}

record 嵌套模式

  @Testpublic void test2(){record Point(int x,int y){}enum Color{RED,YELLOW}record ColoredPoint(Point p,Color c){};record  Rectangle(ColoredPoint upperLeft,ColoredPoint lowerPoint){}//一个测试record嵌套类实例Rectangle rectangle = new Rectangle(new ColoredPoint(new Point(1, 1), Color.RED), null);//现在我们要获取upperLeft的Color我们就可以这样实现if(rectangle instanceof Rectangle(ColoredPoint l,ColoredPoint r)){System.out.println(l.c);}//如果需要跟进一步解析,也可以通过更进一步定义内部嵌套类型if(rectangle instanceof Rectangle(ColoredPoint(Point p,Color c),ColoredPoint ur)){//直接调用定义的变量c,就可以获取到对应的记录值System.out.println(c);}}
  • 类型匹配必须要准确,如下,定义的record类是Object,但是判断是String类型,就回出现无法匹配的错误
  @Testpublic void test3(){record Pair(Object x, Object y) {}Pair p = new Pair(42, 42);if (p instanceof Pair(String s, String t)) {System.out.println(s + ", " + t);} else {System.out.println("Not a pair of strings");}}

Switch的模式匹配(Pattern Matching for switch)

switch case语句

case标签匹配常量,在JDK21之前,经常通过if语句进行判断,而之后,增加了case语句的标签
case when 表达式作为扩展
另一种形式:可以通过常量,简化判断逻辑增加可读性

    @Testpublic void test1() {String str = "YES";switch (str) {case null -> {}case String swhen s.equalsIgnoreCase("YES") -> {System.out.println("YES");}case String swhen s.equalsIgnoreCase("NO") -> {System.out.println("NO");}case "A", "a" -> {System.out.println(str);}default -> {System.out.println("DEFAULT");}}}

swith和枚举常量

  改进枚举常量的大小写标签;扩展大小写标签,除常量外,还包括模式和null;扩展switch语句和switch表达式的选择器表达式允许的类型范围(以及对switch块的穷尽性进行所需的更丰富的分析)允许可选的when子句跟在case标签后面。
    @Testpublic void test5() {interface CardClassification  {}enum Suit implements CardClassification { CLUBS, DIAMONDS, HEARTS, SPADES }final class Tarot implements CardClassification {}CardClassification c = Suit.CLUBS;switch (c) {case Suit.CLUBS -> {System.out.println("It's clubs");}case Suit.DIAMONDS -> {System.out.println("It's diamonds");}case Suit.HEARTS -> {System.out.println("It's hearts");}case Suit.SPADES -> {System.out.println("It's spades");}case Tarot t -> {System.out.println("It's a tarot");}default -> throw new IllegalStateException("Unexpected value: " + c);}}

优化枚举常量case标签

  1、对于继承枚举,只允许具体的枚举名称2.对于指定具体的枚举类型,可以不用具体的枚举表达式
    public void test6(){interface Currency {}enum Coin implements Currency { HEADS, TAILS }Currency c = Coin.HEADS;Coin cc = Coin.HEADS;switch (cc) {case HEADS -> {System.out.println("Heads");}case Coin.TAILS -> {    // Unnecessary qualification but allowedSystem.out.println("Tails");}}switch (c) {case Coin.HEADS -> {System.out.println("Heads");}case TAILS -> {         // Error - TAILS must be qualifiedSystem.out.println("Tails");}default -> {System.out.println("Some currency");}}}

官网地址:https://openjdk.org/projects/jdk/21/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/837002.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NOIP2024加赛6

让人家来打模拟赛,被吊打了吧。一签三计数,罚坐了。 草莓 简单贪心,随便贪就过了。点此查看代码 #include<bits/stdc++.h> using namespace std; #define rep(i,s,t,p) for(int i = s;i <= t;i += p) #define drep(i,s,t,p) for(int i = s;i >= t;i -= p) #ifde…

java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法

java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法@目录一、记录文件相关操作方法二、代码1.读取路径返回List<File>2.读取路径返回List<String>3.删除文件夹4.删除文件 一、记录文件相关操作方法 二、代…

一些再也不敢了的行为

前言:考完 CSP-S 2024 才总结出来的各种离谱错误。本文不讨论类似于在有环图上跑拓扑排序这种错误,直接说会见祖宗的行为。进入考场前检查好准考证和身份证等必要物品,笔者因为这个原因 \(2024\) 年联合省选被困在了门外。由于不是正式选手,最终被放了进去。如果当前电脑运…

什么是水鱼?三分钟教会你

"水鱼"是广西人最喜欢玩的酒桌游戏,它属于扑克牌的一种玩法,经过不断改良升级而来。如果你在广西不会水鱼,那喝酒就没有了灵魂。虽然广西名族很多,水鱼玩法不一样,但是同一个框架,内容不同而已。比如有些地方黑桃花色最大,有些地方红桃花色最大,这种一般玩2,…

Oracle Linux 9.5 正式版发布 - Oracle 提供支持 RHEL 兼容发行版

Oracle Linux 9.5 正式版发布 - Oracle 提供支持 RHEL 兼容发行版Oracle Linux 9.5 正式版发布 - Oracle 提供支持 RHEL 兼容发行版 Oracle Linux with Unbreakable Enterprise Kernel (UEK) & Red Hat compatible kernel (RHCK) 请访问原文链接:https://sysin.org/blog/o…

List集合按照由小到大排序或者由大到小排序

@目录背景原代码由小到大排序由大到小排序 背景原List<User>里面是无序的,比如从redis查找等情况,查出来的是无序的,现在想按照由小到大排序或者由大到小排序。原代码 List<User> list = new ArrayList<>(); list.add(new User(3, "c", new Dat…

pta两次大作业

PTA 两次大作业总结:详细分析与实践经验 前言 回顾这次的家具强电电路模拟程序大作业,它无疑是一次极具挑战的编程与设计经历。从最初简单的电路组件模拟,到后期复杂的多设备连接和精准的控制反馈,这个过程不仅让我掌握了许多技术技能,还在思维方式、问题解决能力以及系统…

mac安装maven3.8.8

问题描述 down了一个新应用, maven依赖总是加载不到, 本地仓库也能找到, 项目启动报错 org.apache.skywalking:apm-toolkit-trace:pom:5.0.0-RC-SNAPSHOT failed to transfer from http://0.0.0.0/ during a previous attempt. This failure was cached in the local repositor…

mac 安装maven

问题描述 down了一个新应用, maven依赖总是加载不到, 本地仓库也能找到, 项目启动报错 org.apache.skywalking:apm-toolkit-trace:pom:5.0.0-RC-SNAPSHOT failed to transfer from http://0.0.0.0/ during a previous attempt. This failure was cached in the local repositor…

一个基于 .NET 8.0 构建的简单、跨平台、模块化商城系统

前言 今天给大家分享一个基于 .NET 8.0 构建的开源免费(MIT License)、简单、跨平台、模块化的商城系统:Module Shop。 主要功能销售:订单、物流。 内容:首页配置、评论、回复。 配置:国家、用户、仓库、运费、高级设置。 商品:分类、品牌、单位、选项(销售属性)、属性…

IDEA如何新增一个模块和删除一个模块

前言 大家好,我是小徐啊。今天小徐要给大家介绍下IDEA里面如何新增和删除模块。在开发过程中,我有时候会遇到多模块的项目,有时候自己也要增加相应的模块,用不同的模块去开发不同的功能。那么该如何操作呢? 如何新增模块 首先,在IDEA中,将鼠标放在项目的根目录上,然后右…

从汇编看函数调用传参过程

1 示例代码 #include <stdio.h>int func(int param1 ,int param2,int param3) {int var1 = param1;int var2 = param2;int var3 = param3;printf("var1=%d,var2=%d,var3=%d",var1,var2,var3);return var1; }int main(int argc, char* argv[]) {int result = fu…