网易首页 > 网易号 > 正文 申请入驻

JDK8 写 10 行,JDK17 写 1 行,我还用它干嘛?

0
分享至

Java精选面试题(微信小程序):5000+道面试题和选择题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计、大厂真题等,在线随时刷题!

还在用 Java 8 写代码?是时候升级你的技能库了!JDK 17 作为一个长期支持版本,带来了一系列令人惊艳的语法特性,让 Java 编程变得更加简洁高效。

从优雅的密封类到简洁的记录类,从模式匹配到文本块,这些"神仙语法"不仅能让你的代码行数减少 30%,还能提高代码可读性和维护性。

作为一位使用 JDK 17 已有两年的开发者,我将分享这些强大特性如何在实际项目中为我节省了无数时间,并彻底改变了我编写 Java 代码的方式。准备好迎接 Java 的新时代了吗?

一、从 JDK 8 到 JDK 17

为什么 JDK 17 是里程碑版本

JDK 17 不仅仅是一个普通的版本更新,它标志着 Java 平台的重大转变。作为继 JDK 8 和 JDK 11 之后的又一个长期支持(LTS)版本,JDK 17 集成了自 JDK 9 以来的所有创新特性,是 Java 现代化进程中的重要里程碑。

长期支持版本的意义

作为 LTS 版本,JDK 17 将获得至少 8 年的支持期。这意味着企业可以安心地将其应用迁移到 JDK 17 上,享受新特性带来的便利,同时不必担心频繁升级的问题。对于那些仍在使用 JDK 8 的开发者来说,直接跳到 JDK 17 是一个明智的选择。

二、记录类(Record)

传统 JavaBean 的痛点

在传统 Java 开发中,创建一个简单的数据类需要编写大量模板代码:

public classPerson {     privatefinal String name;     privatefinalint age;     publicPerson(String name, int age) {         this.name = name;         this.age = age;     }     public String getName() { return name; }     publicintgetAge() { return age; }     @Override     publicbooleanequals(Object o) {         // 长长的equals实现...     }     @Override     publicinthashCode() {         // hashCode实现...     }     @Override     public String toString() {         return"Person[name=" + name + ", age=" + age + "]";     } }

这种冗长的代码不仅编写麻烦,而且容易出错,更重要的是它掩盖了类的本质意图。

Record 的基本语法与使用

JDK 17 中的记录类(Record)彻底解决了这个问题:

publicrecordPerson(String name, int age) {}

就这么简单!编译器会自动为你生成构造器、getter 方法、equals()hashCode()toString()方法。这一行代码等同于前面的几十行代码,简直是偷懒神器!

Record 与不可变对象

Record 天生是不可变的,这符合函数式编程的理念,有助于编写线程安全的代码。如果你需要修改记录的某个字段,只能创建一个新的实例:

Personalice=newPerson("Alice", 25); // 想要修改年龄?创建一个新实例 PersonolderAlice=newPerson(alice.name(), alice.age() + 1);
何时使用与不使用 Record

Record 非常适合作为 DTO(数据传输对象)、值对象或不可变数据容器。但它也有局限性:不能继承其他类,不能声明实例字段(除了在构造函数中定义的),不能是抽象的。如果你需要这些特性,还是应该使用传统类。

三、密封类(Sealed Classes)

密封类的核心概念

在 Java 中,一个类要么是 final 的(不能被继承),要么可以被任何类继承。密封类(Sealed Classes)提供了一种中间状态:你可以指定哪些类可以继承它。

publicsealedclassShapepermits Circle, Rectangle, Triangle {     // 共享方法和属性 }
permits 关键字详解

permits 关键字明确列出了允许继承该密封类的所有子类。子类必须使用finalsealednon-sealed修饰符来声明自己的继承策略:

public finalclassCircleextendsShape {     // Circle不能再被继承 } publicsealedclassRectangleextendsShapepermits Square {     // Rectangle只能被Square继承 } publicnon-sealedclassTriangleextendsShape {     // Triangle可以被任何类继承 }
与接口结合使用

密封特性也适用于接口:

publicsealedinterfaceVehiclepermits Car, Truck, Motorcycle {     voidmove(); }
实际应用案例

密封类非常适合领域建模,特别是当你有一个封闭的类型集合时:

public sealedinterfacePaymentMethodpermits CreditCard, DebitCard, BankTransfer, DigitalWallet {     booleanprocessPayment(double amount); } publicfinalclassCreditCardimplementsPaymentMethod {     @Override     publicbooleanprocessPayment(double amount) {         // 信用卡支付逻辑         returntrue;     } } // 其他实现类...

这样,当你使用 switch 语句处理不同的支付方式时,编译器可以确保你已经处理了所有可能的情况。

四、模式匹配

类型模式匹配

在 JDK 17 之前,使用instanceof进行类型检查后,我们还需要显式地进行类型转换:

// 旧方式 if (obj instanceof String) {     Strings= (String) obj;     if (s.length() > 5) {         // 使用字符串 s     } }

JDK 17 引入了模式匹配,可以在instanceof中直接绑定变量:

// 新方式 if (obj instanceof String s && s.length() > 5) {     // 直接使用字符串 s }

简洁明了,一气呵成!

switch 表达式增强

JDK 17 中的 switch 也支持了模式匹配:

Objectobj= getSomeObject(); Stringresult=switch (obj) {     case Integer i -> "整数: " + i;     case String s -> "字符串: " + s;     case Person p -> "人: " + p.name();     default -> "未知类型"; };
性能考量

模式匹配不仅提高了代码可读性,而且在许多情况下还能提升性能,因为编译器可以对模式匹配进行优化,减少冗余的类型检查。

五、文本块

传统字符串拼接的问题

在 JDK 15 之前,处理多行字符串是一件痛苦的事情:

Stringhtml="\n" +               "    \n" +               "         Hello, World!\n" +               "    \n" +               "";

这种代码不仅难以维护,而且容易出错。

文本块语法详解

JDK 17 中的文本块(Text Blocks)让多行字符串变得简单:

Stringhtml="""                                                       Hello, World!                                               """;

文本块以三个双引号开始和结束,中间的内容可以包含任意字符,包括换行符和引号,无需转义。

格式控制技巧

文本块会自动删除每行开头的公共空白,但你可以通过\s来保留空格,或使用 `` 来连接行:

Stringquery="""                SELECT id, name, email \                FROM users \                WHERE status = 'ACTIVE' \                ORDER BY name""";
JSON、SQL 和 HTML 处理实例

文本块特别适合处理结构化文本:

// JSON示例 StringjsonConfig="""                     {                         "appName": "神仙应用",                         "version": "1.0.0",                         "features": [                             "记录类",                             "密封类",                             "模式匹配"                         ]                     }                     """; // SQL示例 Stringsql="""              SELECT p.name, p.age, a.city              FROM persons p              JOIN addresses a ON p.id = a.person_id              WHERE a.country = '中国'                AND p.age > 18              """;

六、var 与增强型 switch

类型推断的魅力

虽然 var 是在 JDK 10 中引入的,但它与 JDK 17 的其他特性结合使用时,可以让代码更加简洁:

// 不使用var Map > groupedPeople =  newHashMap<>(); // 使用var vargroupedPeople=newHashMap >();
switch 表达式与 yield

JDK 17 中的 switch 可以作为表达式使用,并且可以直接返回值:

int dayOfWeek=3; Stringday=switch (dayOfWeek) {     case1 -> "星期一";     case2 -> "星期二";     case3 -> "星期三";     case4 -> "星期四";     case5 -> "星期五";     case6, 7 -> "周末";     default -> "无效日期"; };

如果需要更复杂的逻辑,可以使用代码块和 yield 关键字:

String result=switch (status) {     case"PENDING" -> {         log.info("处理待定状态");         yield"处理中";     }     case"APPROVED" -> {         log.info("处理已批准状态");         yield"已完成";     }     default -> "未知状态"; };
箭头语法与多分支处理

新的 switch 语法支持使用箭头->来简化代码,并且可以在一个 case 中处理多个值:

Seasonseason=switch (month) {     case3, 4, 5 -> Season.SPRING;     case6, 7, 8 -> Season.SUMMER;     case9, 10, 11 -> Season.AUTUMN;     case12, 1, 2 -> Season.WINTER;     default -> thrownewIllegalArgumentException("无效月份"); };
代码可读性的平衡

虽然这些新特性可以让代码更简洁,但也要注意不要过度使用,导致代码难以理解。保持适度,让代码既简洁又清晰。

七、其他实用特性大集合

私有接口方法

从 JDK 9 开始,接口可以包含私有方法,这在实现默认方法时非常有用:

public interfaceLogger {     defaultvoidlogInfo(String message) {         log(message, "INFO");     }     defaultvoidlogError(String message) {         log(message, "ERROR");     }     // 私有辅助方法     privatevoidlog(String message, String level) {         System.out.println("[" + level + "] " + message);     } }
改进的 Stream API

JDK 17 中的 Stream API 增加了一些实用方法:

// 将流转换为List(不需要再调用collect(Collectors.toList())) List names = people.stream()                           .map(Person::name)                           .filter(name -> name.startsWith("张"))                           .toList(); // 新的mapMulti方法,可以为每个元素生成多个结果 List words = sentences.stream()                              .mapMulti((sentence, consumer) -> {                                  for (String word : sentence.split(" ")) {                                      consumer.accept(word);                                  }                              })                              .toList();
增强的 NullPointerException

JDK 17 中的NullPointerException会提供更详细的错误信息,指出哪个变量是 null:

// 旧版本的错误信息 Exception in thread "main" java.lang.NullPointerException // JDK 17 的错误信息 Exception in thread "main" java.lang.NullPointerException:    Cannot invoke "Person.getName()" because "person" is null

这大大提高了调试效率,不再需要猜测哪个对象是 null。

新的垃圾收集器

JDK 17 提供了多种垃圾收集器选项,包括 ZGC(Z Garbage Collector),它能够处理 TB 级别的堆内存,同时保持低于 10ms 的暂停时间:

// 启用ZGC的JVM参数 -XX:+UseZGC
外部内存访问 API

JDK 17 引入了外部内存访问 API,允许 Java 程序安全地访问堆外内存:

// 分配堆外内存 try (MemorySegmentsegment= MemorySegment.allocateNative(100)) {     // 写入数据     MemoryAccess.setInt(segment, 0, 42);     // 读取数据     intvalue= MemoryAccess.getInt(segment, 0);     System.out.println(value); // 输出: 42 }

这对于需要与本地代码交互或处理大量数据的应用程序特别有用。

JDK 17 带来的这些"神仙语法"不仅让 Java 代码更加简洁优雅,还提高了开发效率和运行性能。https://juejin.cn/post/7529035047552335907

作为一名 Java 开发者,掌握这些新特性将让你在编码过程中如虎添翼。是时候告别那些冗长的老式 Java 代码,拥抱现代 Java 编程的美好未来了!

来源:https://juejin.cn/post/7529035047552335907

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
演员王星自曝被骗缅甸时手机被人拿走刷了数万元网贷,回国后自己分期还款;透露有人找他出演“人口贩卖”题材影片,但都拒绝了

演员王星自曝被骗缅甸时手机被人拿走刷了数万元网贷,回国后自己分期还款;透露有人找他出演“人口贩卖”题材影片,但都拒绝了

扬子晚报
2025-12-27 18:49:32
52岁何晴脑瘤康复后素颜报平安,这张旧照藏着太多坚韧!

52岁何晴脑瘤康复后素颜报平安,这张旧照藏着太多坚韧!

无心小姐姐
2025-12-27 22:19:42
湖人大胜国王!36岁德罗赞和41岁的詹姆斯已根本不在一个级别!

湖人大胜国王!36岁德罗赞和41岁的詹姆斯已根本不在一个级别!

田先生篮球
2025-12-29 13:48:47
为何动物都怕鹅?有鹅的地方没有蛇?鹅的真实面貌超出大家的想象

为何动物都怕鹅?有鹅的地方没有蛇?鹅的真实面貌超出大家的想象

半解智士
2025-12-18 21:30:37
已经烂到没有底线了

已经烂到没有底线了

徐帮阳
2025-12-25 20:52:14
扣押中国油轮后,美方发现中国货轮填满导弹,白宫的说法终于变了

扣押中国油轮后,美方发现中国货轮填满导弹,白宫的说法终于变了

老谢谈史
2025-12-28 03:34:10
成都4s店爆炸后续:段某当场死亡,涉事销售肠子悔青,恐要担责

成都4s店爆炸后续:段某当场死亡,涉事销售肠子悔青,恐要担责

有范又有料
2025-12-29 16:23:35
中超转会动态:保级队再官宣5名内援离队,新赛季首个新外援敲定

中超转会动态:保级队再官宣5名内援离队,新赛季首个新外援敲定

中超伪球迷
2025-12-29 14:59:31
小到中雪+8级大风,即将抵达武汉

小到中雪+8级大风,即将抵达武汉

越乔
2025-12-29 15:20:01
刘国梁罕见再评“八一战”,首次承认樊振东伟大

刘国梁罕见再评“八一战”,首次承认樊振东伟大

阅尽天下精彩
2025-11-29 09:15:02
东部战区台海军演海报:拦截载“海马斯”货船,还拦截美军核潜艇

东部战区台海军演海报:拦截载“海马斯”货船,还拦截美军核潜艇

蓝星杂谈
2025-12-29 12:53:10
明年1月1日起 这两类人违法也可能被行拘!

明年1月1日起 这两类人违法也可能被行拘!

看看新闻Knews
2025-12-28 21:37:21
欧阳妮妮儿子周岁宴曝光!宝宝穿小西装虎头虎脑,娜娜也在现场

欧阳妮妮儿子周岁宴曝光!宝宝穿小西装虎头虎脑,娜娜也在现场

小徐讲八卦
2025-12-29 12:08:53
输掉性别大战,萨巴伦卡:不明白外界为何用负面角度讨论

输掉性别大战,萨巴伦卡:不明白外界为何用负面角度讨论

体育妞世界
2025-12-29 14:12:51
美司令:一旦中国在台海设禁飞区,美军就只能击沉解放军的战舰了

美司令:一旦中国在台海设禁飞区,美军就只能击沉解放军的战舰了

浮光惊掠影
2025-12-12 23:27:34
24分大胜国王!詹姆斯证明湖人大错特错,东契奇应跟他学如何争冠

24分大胜国王!詹姆斯证明湖人大错特错,东契奇应跟他学如何争冠

小路看球
2025-12-29 15:28:41
海南封关运作后,就相当于中国版的新加坡正式上线了。

海南封关运作后,就相当于中国版的新加坡正式上线了。

流苏晚晴
2025-12-21 16:05:12
1958年,李达和毛泽东吵架,李达怒言:你脑子发热,高烧到39度了

1958年,李达和毛泽东吵架,李达怒言:你脑子发热,高烧到39度了

大运河时空
2025-12-28 08:20:03
5架美制无人机围堵钓鱼岛,日本赌中方不敢击落?反制手段早备好

5架美制无人机围堵钓鱼岛,日本赌中方不敢击落?反制手段早备好

素衣读史
2025-12-27 18:26:42
尾盘突发!600118,强势涨停,今年暴涨超200%!市值破1000亿元!

尾盘突发!600118,强势涨停,今年暴涨超200%!市值破1000亿元!

证券时报e公司
2025-12-29 17:05:17
2025-12-29 18:15:00
Java精选
Java精选
一场永远也演不完的戏
1766文章数 3859关注度
往期回顾 全部

科技要闻

肉搏非洲,传音不想只当个卖手机的

头条要闻

"最快女护士"被指遭中国田协除名 官方发声

头条要闻

"最快女护士"被指遭中国田协除名 官方发声

体育要闻

“史上最贵”的世界杯,球迷成了韭菜

娱乐要闻

谭松韵扛剧能力被质疑 赵丽颖成女主?

财经要闻

翁杰明:宏观数据与居民微观感受存在差距

汽车要闻

“路”要越走越深,猛士的智能越野时代来了

态度原创

教育
时尚
艺术
健康
旅游

教育要闻

大学转专业是标配?醒醒!90%的家庭不成功都栽在这个隐形环节里

“勃肯鞋”今年冬天爆火!这几双怎么搭都好看

艺术要闻

克里姆特风格的女性人物画,太美了!

这些新疗法,让化疗不再那么痛苦

旅游要闻

瞰中国|福建周宁:山水为画

无障碍浏览 进入关怀版