我有点想用JDK17了

2024-06-04 22:20
文章标签 有点 想用 jdk17

本文主要是介绍我有点想用JDK17了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好呀,我是summo,JDK版本升级的非常快,现在已经到JDK20了。JDK版本虽多,但应用最广泛的还得是JDK8,正所谓“他发任他发,我用Java8”。

其实我也不太想升级JDK版本,感觉投入高,收益小,不过有一次我看到了一些使用JDK17新语法写的代码,让我改变了对升级JDK的看法,因为这些新语法我确实想用!

废话不多说,上代码!

一、JDK17语法新特性

1. 文本块

这个更新非常实用。在没有这个特性之前,编写长文本非常痛苦。虽然IDEA等集成开发工具可以自动处理,但最终效果仍然丑陋,充满拼接符号。现在,通过字符串块,我们可以轻松编写JSON、HTML、SQL等内容,效果更清爽。这个新特性值得五颗星评价,因为它让我们只需关注字符串本身,而无需关心拼接操作。

原来的写法

/*** 使用JDK8返回HTML文本** @return 返回HTML文本*/
public static final String getHtmlJDK8() {return "<html>\n" +" <body>\n" +" <p>Hello, world</p>\n" +" </body>\n" +"</html>";
}

新的写法

/*** 使用JDK17返回HTML文本** @return 返回HTML文本*/
public static final String getHtmlJDK17() {return """<html><body><p>Hello, world</p></body></html>""";
}

推荐指数:⭐️⭐️⭐️⭐️⭐️

2. NullPointerException增强

这一功能非常强大且实用,相信每位Java开发者都期待已久。空指针异常(NPE)一直是Java程序员的痛点,因为报错信息无法直观地指出哪个对象为空,只抛出一个NullPointerException和一堆堆栈信息,定位问题耗时且麻烦。尤其在遇到喜欢级联调用的代码时,逐行排查更是令人头疼。如果在测试环境中,可能还需通过远程调试查明空对象,费时费力。为此,阿里的编码规范甚至不允许级联调用,但这并不能彻底解决问题。Java17终于在这方面取得了突破,提供了更详细的空指针异常信息,帮助开发者迅速定位问题源头。

public static void main(String[] args) {try {//简单的空指针String str = null;str.length();} catch (Exception e) {e.printStackTrace();}try {//复杂一点的空指针var arr = List.of(null);String str = (String)arr.get(0);str.length();} catch (Exception e) {e.printStackTrace();}
}

运行结果

推荐指数:⭐️⭐️⭐️⭐️⭐️

3. Records

在Java中,POJO对象(如DO、PO、VO、DTO等)通常包含成员变量及相应的Getter和Setter方法。尽管可以通过工具或IDE生成这些代码,但修改和维护仍然麻烦。Lombok插件为此出现,能够在编译期间自动生成Getter、Setter、hashcode、equals和构造函数等代码,使用起来方便,但对团队有依赖要求。
为此,Java引入了标准解决方案:Records。它通过简洁的语法定义数据类,大大简化了POJO类的编写,如下所示。虽然hashcode和equals方法仍需手动编写,但IDE能够自动生成。这一特性有效解决了模板代码问题,提升了代码整洁度和可维护性。

package com.summo.jdk17;/*** 3星** @param stuId     学生ID* @param stuName   学生名称* @param stuAge    学生年龄* @param stuGender 学生性别* @param stuEmail  学生邮箱*/
public record StudentRecord(Long stuId,String stuName,int stuAge,String stuGender,String stuEmail) {public StudentRecord {System.out.println("构造函数");}public static void main(String[] args) {StudentRecord record = new StudentRecord(1L, "张三", 16, "男", "xxx@qq.com");System.out.println(record);}
}

推荐指数:⭐️⭐️⭐️⭐️

4. 全新的switch表达式

有人可能问了,Java语言不早已支持switch了嘛,有什么好提的?讲真,这次的提升还真有必要好好地来聊一聊了。在Java12的时候就引入了switch表达式,注意这里是表达式,而不是语句,原来的switch是语句。如果不清楚两者的区别的话,最好先去了解一下。主要的差别就是就是表达式有返回值,而语句则没有。再配合模式匹配,以及yield和“->”符号的加入,全新的switch用起来爽到飞起来。

package com.summo.jdk17;public class SwitchDemo {/*** 在JDK8中获取switch返回值方式** @param week* @return*/public int getByJDK8(Week week) {int i = 0;switch (week) {case MONDAY, TUESDAY:i = 1;break;case WEDNESDAY:i = 3;break;case THURSDAY:i = 4;break;case FRIDAY:i = 5;break;case SATURDAY:i = 6;break;case SUNDAY:i = 7;break;default:i = 0;break;}return i;}/*** 在JDK17中获取switch返回值** @param week* @return*/public int getByJDK17(Week week) {// 1, 现在的switch变成了表达式,可以返回值了,而且支持yield和->符号来返回值// 2, 再也不用担心漏写了break,而导致出问题了// 3, case后面支持写多个条件return switch (week) {case null -> -1;case MONDAY -> 1;case TUESDAY -> 2;case WEDNESDAY -> 3;case THURSDAY -> {yield 4;}case FRIDAY -> 5;case SATURDAY, SUNDAY -> 6;default -> 0;};}private enum Week {MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY}
}

推荐指数:⭐️⭐️⭐️⭐️

5. 私有接口方法

从Java8开始,允许在interface里面添加默认方法,其实当时就有些小困惑,如果一个default方法体很大怎么办,拆到另外的类去写吗?实在有些不太合理,所以在Java17里面,如果一个default方法体很大,那么可以通过新增接口私有方法来进行一个合理的拆分了,为这个小改进点个赞。

public interface PrivateInterfaceMethod {/*** 接口默认方法*/default void defaultMethod() {privateMethod();}// 接口私有方法,在Java8里面是不被允许的,不信你试试private void privateMethod() {}
}

推荐指数:⭐️⭐️⭐️

6. 模式匹配

在JDK 17中,模式匹配主要用于instanceof表达式。模式匹配增强了instanceof的语法和功能,使类型检查和类型转换更加简洁和高效。在传统的Java版本中,我们通常使用instanceof结合类型转换来判断对象类型并进行处理,这往往会导致冗长的代码。

原来的写法

/*** 旧式写法** @param value*/
public void matchByJDK8(Object value) {if (value instanceof String) {String v = (String)value;System.out.println("遇到一个String类型" + v.toUpperCase());} else if (value instanceof Integer) {Integer v = (Integer)value;System.out.println("遇到一个整型类型" + v.longValue());}
}

新的写法

/*** 转换并申请了一个新的变量,极大地方便了代码的编写** @param value*/
public void matchByJDK17(Object value) {if (value instanceof String v) {System.out.println("遇到一个String类型" + v.toUpperCase());} else if (value instanceof Integer v) {System.out.println("遇到一个整型类型" + v.longValue());}
}

推荐指数:⭐️⭐️⭐️⭐️

7. 集合类的工厂方法

在Java8的年代,即便创建一个很小的集合,或者固定元素的集合都是比较麻烦的,为了简洁一些,有时我甚至会引入一些依赖。

原来的写法

Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c"

新的写法

Set<String> set = Set.of("a", "b", "c");

推荐指数:⭐️⭐️⭐️⭐️⭐️

二、其他的新特性

1. 新的String方法

  • repeat:重复生成字符串
  • isBlank:不用在引入第三方库就可以实现字符串判空了
  • strip:去除字符串两边的空格,支持全角和半角,之前的trim只支持半角
  • lines:能根据一段字符串中的终止符提取出行为单位的流
  • indent:给字符串做缩进,接受一个int型的输入
  • transform:接受一个转换函数,实现字符串的转换

2. Stream API的增强

增加takeWhile, dropWhile, ofNullable, iterate以及toList的API,越来越像一些函数式语言了。用法举例如下。

// takeWhile 顺序返回符合条件的值,直到条件不符合时即终止继续判断,
// 此外toList方法的加入,也大大减少了节省了代码量,免去了调用collect(Collectors::toList)方法了
List<Integer> list = Stream.of(2,2,3,4,5,6,7,8,9,10).takeWhile(i->(i%2==0)).toList(); // 返回2, 2// dropWhile 顺序去掉符合条件的值,直到条件不符合时即终止继续判断
List<Integer> list1 = Stream.of(2,2,3,4,5,6,7,8,9,10).dropWhile(i->(i%2==0)).toList(); //返回3, 4, 5, 6, 7, 8, 9, 10// ofNullable,支持传入空流,若没有这个且传入一个空流,那么将会抛NPE
var nullStreamCount = Stream.ofNullable(null).count(); //返回0// 以下两行都将输出0到9
Stream.iterate(0, n -> n < 10, n -> n + 1).forEach(x -> System.out.println(x));
Stream.iterate(0, n -> n + 1).limit(10).forEach(x -> System.out.println(x));

3. 全新的HttpClient

这个API首次出现在9之中,不过当时并非是一个稳定版本,在Java11中正式得到发布,所以在Java17里面可以放心地进行使用。原来的JDK自带的Http客户端真的非常难用,这也就给了很多像okhttp、restTemplate、Apache的HttpClient和feign这样的第三方库极大的发挥空间,几乎就没有人愿意去用原生的Http客户端的。但现在不一样了,感觉像是新时代的API了。FluentAPI风格,处处充满了现代风格,用起来也非常地方便,再也不用去依赖第三方的包了,就两个字,清爽。

// 同步请求
HttpClient client = HttpClient.newBuilder().version(Version.HTTP_1_1).followRedirects(Redirect.NORMAL).connectTimeout(Duration.ofSeconds(20)).proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80))).authenticator(Authenticator.getDefault()).build();HttpResponse<String> response = client.send(request, BodyHandlers.ofString());System.out.println(response.statusCode());System.out.println(response.body()); 
// 异步请求
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://foo.com/")).timeout(Duration.ofMinutes(2)).header("Content-Type", "application/json").POST(BodyPublishers.ofFile(Paths.get("file.json"))).build();client.sendAsync(request, BodyHandlers.ofString()).thenApply(HttpResponse::body).thenAccept(System.out::println);

4. jshell

在新的JDK版本中,支持直接在命令行下执行java程序,类似于python的交互式REPL。简而言之,使用 JShell,你可以输入代码片段并马上看到运行结果,然后就可以根据需要作出调整,这样在验证一些简单的代码的时候,就可以通过jshell得到快速地验证,非常方便。

5. java命令直接执行java文件

在现在可以直接通过执行“java xxx.java”,即可运行该java文件,无须先执行javac,然后再执行java,是不是又简单了一步。

6. ZGC

在ParallelOldGC、CMS和G1之后,JDK 11引入了全新的ZGC(Z Garbage Collector)。这个名字本身就显得很牛。官方宣称ZGC的垃圾回收停顿时间不超过10ms,能支持高达16TB的堆空间,并且停顿时间不会随着堆的增大而增加。那么,ZGC到底解决了什么问题?Oracle官方介绍它是一个可伸缩的低延迟垃圾回收器,旨在降低停顿时间,尽管这可能会导致吞吐量的降低。不过,通过横向扩展服务器可以解决吞吐量问题。官方已建议ZGC可用于生产环境,这无疑将成为未来的主流垃圾回收器。要了解更多,请参阅官方文档。

三、小结一下

作为程序员,持续学习和充电非常重要。随着Java8即将停止免费官方支持,越来越多的项目将转向Java17,包括大名鼎鼎的Spring Boot 3.0,它在2022年1月20日发布的第一个里程碑版本(M1)正是基于Java17构建的。该项目依赖的所有组件也将快速升级,未来如果想利用某些新特性,在Java8下将无法通过编译.,到这时候再换就真的晚了… …

这篇关于我有点想用JDK17了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031284

相关文章

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

最近心情有点复杂:论心态

一月一次的彷徨又占据了整个身心;彷徨源至不自信;而不自信则是感觉自己的价值没有很好的实现亦或者说是自己不认可自己的目前的生活和状态吧。 我始终相信一句话:任何人的生活形态完全是由自己决定的;外在的总归不能直达一个人的内心深处。所以少年 为了自己想要的生活 多坚持努力吧、不为别人只为自己心中的那一丝执着。 由此我看到了一个故事: 一个心情烦躁的人去拜访禅师。他问禅师:我这辈子就这么注定了吗?您

若依库存管理 ruoyi-wms V2.0发布:升级到jdk17和vue3,支持一物一码

开源地址 https://gitee.com/zccbbg/wms-ruoyi 项目代码、文档 均开源免费可商用 遵循开源协议在项目中保留开源协议文件即可 活到老写到老 为兴趣而开源 为学习而开源 为让大家真正可以学到技术而开源 若依wms是一套基于若依的wms仓库管理系统,支持lodop和网页打印入库单、出库单。毫无保留给个人及企业免费使用。 前端采用Vue、Element UI。

XtQuant接口概述,想用miniQMT做量化哪家券商支持?

XtQuant.XtData 行情模块 xtdata是xtquant库中提供行情相关数据的模块,本模块旨在提供精简直接的数据满足量化交易者的数据需求,作为python库的形式可以被灵活添加到各种策略脚本中。 主要提供行情数据(历史和实时的K线和分笔)、财务数据、合约基础信息、板块和行业分类信息等通用的行情数据。 接口概述 #运行逻辑 xtdata提供和MiniQmt的交互接口,本质是和M

9:00面试,9:05就出来了,问的问题有点出乎意料!

从小厂跳槽出来,本以为能在新公司大展拳脚,没想到没多久就再次遭遇困境。 入职初期,加班成了家常便饭,尽管如此,考虑到薪酬还算可观,我并没有过多抱怨。然而,到了六月,一纸通知打破了平静——公司宣布薪资要下调百分之四十。这样一来,连基本的生活开销都成了问题。 这一连串的变故让我措手不及,原本满怀期待的心情瞬间跌入谷底。面对突如其来的挑战,我不得不重新审视自己的职业规划,并思考下一步该何去何从。

bug----jdk17使用JOL无法输出java对象的存储布局

项目场景: 提示:这里简述项目相关背景: 在idea中以jdk17为开发环境,使用 jol-core.016 版本没办法输出java 对象的存储结构信息,会让程序崩溃。 问题描述 提示:这里描述项目中遇到的问题: 这是我的测试代码: public class ObjectLayout {public static void main(String[] args) {Student

使用JDK17的record关键字编译报错踩坑

先看报错 jdk版本是17.应该是支持的啊。第一次使用record关键字就这样了吗。 解决 在设置里面把字节码版本改为17就行,因为以前是运行jdk8的所以会出现这个问题。 设置好了之后编译就通过了。 总结 一般出现编译错误,首先看一下Project Structure 再看一下。Build,Execution,Deployment -> Compiler -> Java

Linux CentOS java JDK17

1.  下载 cd /usr/local/wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2. 解压 tar -zxf jdk-17_linux-x64_bin.tar.gz 3.配置环境变量 vim /etc/profile// 在末尾处添加 export JAVA_HOM

做测开的第4年,开始有点失望了

大家好,我是洋子,看到新一年的毕业季,意味着我工作马上满4年了 从一毕业就进入测试行业到现在,我已经褪去学生的气息,成为一名社畜工具人 这4年当中,我有3年半都在同一家互联网大厂工作,岗位是测开,厂内大家都叫QA 2024年已经过半了,整个就业大环境依然对打工人很不友好,裁员还是家常便饭,唯一看到的风口还是大模型,大模型的快速发展,激起了广泛讨论,未来究竟自己会不会被AI所取代? 说到大模