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

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.

相关推荐
热点推荐
医生忠告:吃完降压药千万别碰这3样食物,患者要牢记,不能大意

医生忠告:吃完降压药千万别碰这3样食物,患者要牢记,不能大意

今日养生之道
2025-10-23 08:08:38
让你三观尽毁的事有哪些?网友:第一个最炸裂,太污了

让你三观尽毁的事有哪些?网友:第一个最炸裂,太污了

解读热点事件
2025-10-23 00:15:02
俄军步兵遭受巨大伤亡画面曝光!不计代价冲锋,尸体铺满道路

俄军步兵遭受巨大伤亡画面曝光!不计代价冲锋,尸体铺满道路

环球热点快评
2025-11-03 22:40:40
麦孔:劳塔罗打进一个真正队长般的进球,向队友传递他的决心

麦孔:劳塔罗打进一个真正队长般的进球,向队友传递他的决心

懂球帝
2025-11-06 07:53:08
中方狠招制朱拉尼,俄美英法难还击,阿萨德逆势翻盘?

中方狠招制朱拉尼,俄美英法难还击,阿萨德逆势翻盘?

林子说事
2025-11-04 05:43:58
巴萨旧将:我的两座欧冠总被开玩笑;亚马尔达不到梅西的高度

巴萨旧将:我的两座欧冠总被开玩笑;亚马尔达不到梅西的高度

懂球帝
2025-11-06 07:00:09
因香气被采到濒危!2023年,又耗时14年人工繁育5.5万棵

因香气被采到濒危!2023年,又耗时14年人工繁育5.5万棵

万象硬核本尊
2025-11-05 19:34:02
一位资深地产大佬对于万科现状的解读(1)

一位资深地产大佬对于万科现状的解读(1)

科学发掘
2025-11-05 11:47:58
冲上热搜!小米YU7全网首拆,结果令人太意外……

冲上热搜!小米YU7全网首拆,结果令人太意外……

恪守原则和底线
2025-11-05 15:55:51
印媒指出福建舰严重设计缺陷! 这回没瞎说: 福建舰确实存在这问题

印媒指出福建舰严重设计缺陷! 这回没瞎说: 福建舰确实存在这问题

福建平子
2025-11-03 10:21:52
勇士队巴特勒和格林伤情更新,斯蒂芬·库里缺席对阵国王的比赛

勇士队巴特勒和格林伤情更新,斯蒂芬·库里缺席对阵国王的比赛

好火子
2025-11-06 06:39:36
特斯拉撞死突闯国道的野猪,修车费超2万元、车主全责 交警:野猪不属于交通参与者

特斯拉撞死突闯国道的野猪,修车费超2万元、车主全责 交警:野猪不属于交通参与者

红星新闻
2025-11-05 16:04:24
今晨欧冠,阿根廷双锋闪耀:只踢半场均进球,还有更精彩的镜头!

今晨欧冠,阿根廷双锋闪耀:只踢半场均进球,还有更精彩的镜头!

老霍聊球
2025-11-06 07:52:04
央视提醒:免疫力是最好的医生,用8个方法激活它

央视提醒:免疫力是最好的医生,用8个方法激活它

诗词中国
2025-11-03 21:30:33
同事结婚我随2000,我儿子满月他送100,他负责的1000万项目黄了

同事结婚我随2000,我儿子满月他送100,他负责的1000万项目黄了

农村情感故事
2025-11-06 07:33:35
胡真舫,拟升正厅

胡真舫,拟升正厅

新京报
2025-11-05 20:12:43
新款保时捷911 Turbo S国内首发,2.5秒破百,272.8万起

新款保时捷911 Turbo S国内首发,2.5秒破百,272.8万起

汽车公告板
2025-11-05 18:43:01
女子出轨上司被公公现场抓到,公公答应保密,却要儿媳满足个条件

女子出轨上司被公公现场抓到,公公答应保密,却要儿媳满足个条件

林林故事揭秘
2025-01-18 11:46:56
石家庄警方:男子因工作纠纷持刀扎伤两名同事,已被当场控制

石家庄警方:男子因工作纠纷持刀扎伤两名同事,已被当场控制

界面新闻
2025-11-05 13:44:22
燃油车时代会很快结束?内行人预测:油价很可能是最后的关键!

燃油车时代会很快结束?内行人预测:油价很可能是最后的关键!

趣味萌宠的日常
2025-11-05 14:16:06
2025-11-06 09:16:49
Java精选
Java精选
一场永远也演不完的戏
1752文章数 3859关注度
往期回顾 全部

科技要闻

苹果“认输”!曝每年10亿美元租用谷歌AI

头条要闻

记者问了欧盟一个“有趣”的问题 然后被解雇了

头条要闻

记者问了欧盟一个“有趣”的问题 然后被解雇了

体育要闻

赢下皇马,会是利物浦的转折点吗?

娱乐要闻

港星林尚武突发心脏病去世

财经要闻

特朗普关税遭美国高院大法官轮番质疑

汽车要闻

智己LS9入局"9系"混战 全尺寸SUV市场迎来新变量

态度原创

教育
手机
旅游
时尚
公开课

教育要闻

83岁还在学英语?ta们告诉你坚持的意义。

手机要闻

荣耀两款神秘新机被曝光:双2亿方案来袭,明年见!

旅游要闻

黑龙江将开展冬季冰雪旅游“百日行动” 冰雪产业规模有望破万亿

中国色特别策划 | 故宫技艺与古意新生

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版