我有點想用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下將無法通過編譯.,到這時候再換就真的晚了… …

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22349.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22349.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22349.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為、華三交換機、路由器啟用基于端口的環回檢測功能配置

目的 在進行某些特殊功能測試時&#xff0c;例如初步定位以太網故障時&#xff0c;需要開啟以太網接口環回檢測功能&#xff0c;測試接口功能是否異常。 當以太網接口無故障時&#xff0c;開啟環回檢測功能后接口物理狀態和協議狀態將始終處于Up狀態&#xff1b;如果以太網接口…

Linux環境搭建NextCloud

NextCloud是什么 Nextcloud是一款開源免費的私有云存儲網盤項目&#xff0c;可以讓你快速便捷的搭建一套屬于自己或者團隊的云同步網盤&#xff0c;從而實現跨平臺跨設備文件同步&#xff0c;共享&#xff0c;版本控制&#xff0c;團隊協做等功能。它的客戶端覆蓋windows&#…

使用AdaBoost分類方法實現對Wine數據集分類

目錄 1. 作者介紹2. 什么是AdaBoost&#xff1f;2.1 什么是弱分類器2.2 什么是強分類器2.3 如何自適應增強2.4 如何組合弱分類器成為一個強分類器&#xff1f; 3. 什么是Wine數據集3.1 Wine 數據集3.2 Wine 數據集結構 4. 使用AdaBoost分類方法實現對Wine數據集分類5. 完整代碼…

PLC的編程方式有什么編程:深度探索與實用指南

PLC的編程方式有什么編程&#xff1a;深度探索與實用指南 在現代工業自動化領域&#xff0c;可編程邏輯控制器&#xff08;PLC&#xff09;扮演著至關重要的角色。PLC的編程方式多種多樣&#xff0c;每種方式都有其獨特的優點和適用場景。本文將從四個方面、五個方面、六個方面…

k8s 配置資源管理

一、Secret的資源配置 1.1 Secret配置的相關說明 Secret 是用來保存密碼、token、密鑰等敏感數據的 k8s 資源&#xff0c;這類數據雖然也可以存放在 Pod 或者鏡像中&#xff0c;但是放在 Secret 中是為了更方便的控制如何使用數據&#xff0c;并減少暴露的風險。 有四種類型&a…

日志優化開發效率

日志怎么打&#xff1f; 1.在關鍵節點打日志 (1).請求入口 (2).結果響應 2.可能發生錯誤的節點打日志 3.日志不是越多越好&#xff0c;打日志也會消耗性能 RequestMapping("/add")public Boolean publishBlog(String title, String content, HttpServletRequest req…

react快速開始(四)-之Vite 還是 (Create React App) CRA? 用Vite創建項目

文章目錄 react快速開始(四)-之Vite 還是 (Create React App) CRA? 用Vite創建項目背景Vite 和 (Create React App) CRAVite&#xff1f;Vite 是否支持 TypeScript&#xff1f; 用Vite創建react項目參考 react快速開始(四)-之Vite 還是 (Create React App) CRA? 用Vite創建項…

Java面向對象筆記

多態 一種類型的變量可以引用多種實際類型的對象 如 package ooplearn;public class Test {public static void main(String[] args) {Animal[] animals new Animal[2];animals[0] new Dog();animals[1] new Cat();for (Animal animal : animals){animal.eat();}} }class …

Java面試題-集合

Java面試題-集合 1、什么是集合&#xff1f;2、集合和數組的區別是什么&#xff1f;3、集合有哪些特點&#xff1f;4、常用的集合類有哪些&#xff1f;5、List&#xff0c; Set&#xff0c; Map三者的區別&#xff1f;6、說說集合框架底層數據結構&#xff1f;7、線程安全的集合…

MeshFusion Pro : Ultimate Optimization Tool

MeshFusion Pro是Unity的強大優化工具,它使用一種高效的方法來組合對象,以減少繪制調用并提高FPS。 MeshFusion Pro可用于組合靜態對象以及LODGroups。您還可以創建動態組合對象,其中每個單獨的網格都可以在運行時移動,新的組合網格將自動更新。在保持單個網格自由度的同時…

【數據結構與算法 | 二叉樹篇】力扣101, 104, 111

1. 力扣101 : 對稱二叉樹 (1). 題 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱。 示例 1&#xff1a; 輸入&#xff1a;root [1,2,2,3,4,4,3] 輸出&#xff1a;true示例 2&#xff1a; 輸入&#xff1a;root [1,2,2,null,3,null,3] 輸出&#xff1a;false…

Java1.8語言+ springboot +mysql + Thymeleaf 全套家政上門服務平臺app小程序源碼

Java1.8語言 springboot mysql Thymeleaf 全套家政上門服務平臺app小程序源碼 家政系統是一套可以提供上門家政、上門維修、上門洗車、上門搬家等服務為一體的家政平臺解決方案。它能夠與微信對接、擁有用戶端小程序&#xff0c;并提供師傅端app&#xff0c;可以幫助創業者在…

樹的算法基礎知識

什么是樹&#xff1a; 樹是n&#xff08;n>0&#xff09;個結點的有限集。n0時稱為空樹。在任意一棵非空樹中&#xff1a; 有且僅有一個特定的稱為根的結點當n>1時&#xff0c;其余結點可分為m&#xff08;m>0&#xff09;個互不相交的有限集T1、T2、......、Tm&…

ElasticSearch學習筆記之三:Logstash數據分析

第3章 Logstash數據分析 Logstash使用管道方式進行日志的搜集處理和輸出。有點類似*NIX系統的管道命令 xxx | ccc | ddd&#xff0c;xxx執行完了會執行ccc&#xff0c;然后執行ddd。 在logstash中&#xff0c;包括了三個階段: 輸入input --> 處理filter&#xff08;不是必須…

異或炸彈(easy)(牛客小白月賽95)

題目鏈接: D-異或炸彈&#xff08;easy&#xff09;_牛客小白月賽95 (nowcoder.com) 題目&#xff1a; 題目分析&#xff1a; 一看 還以為是二維差分的題呢 到后來才發現是一維差分問題 這里的距離是 曼哈頓距離 dis abs(x - xi) abs(y - yi) 暴力的做法 就是枚舉 n * n 個…

word-海報制作

1、確定海報的尺寸大小 2、創建主題顏色 設計-顏色-自定義顏色-柑橘rgb值改變著色1-著色6的顏色 3、將文字添加至文本框&#xff0c;更改字體顏色、大小和格式 4、添加背景水印&#xff1a;插入-形狀-文本框 5、組合全部元素 圖片素材網址&#xff1a;

Power BI前端設計:深度探索與實戰技巧

Power BI前端設計&#xff1a;深度探索與實戰技巧 Power BI作為一款強大的商業智能工具&#xff0c;其前端設計對于用戶體驗和數據可視化效果至關重要。本文將深入探討Power BI前端設計的四個關鍵方面、五個實用技巧、六個設計要素以及七個注意事項&#xff0c;助您提升Power …

學習分享-如何避免 Apache ShardingSphere 中的笛卡爾積現象

前言 Apache ShardingSphere 是一個開源的分布式數據庫中間件&#xff0c;旨在通過數據分片、分布式事務、分布式治理等技術&#xff0c;提升數據庫系統的性能和可擴展性。然而&#xff0c;最近在使用 ShardingSphere 進行分庫分表并多表查詢時&#xff0c;出現了笛卡爾積現象…

Spark Streaming 概述及入門案例

一、介紹 1. 不同的數據處理 從數據處理的方式&#xff1a; 流式數據處理(Streaming)批量數據處理(Batch) 從數據處理的延遲&#xff1a; 實時數據處理(毫秒級別)離線數據處理(小時或天級別) 2. 簡介 SparkStreaming 是一個準實時(秒或分鐘級別)、微批量的數據處理框架Spa…

在Red Hat Enterprise Linux 9上使用Docker快速安裝并部署RocketMQ

在Red Hat Enterprise Linux 9上快速安裝和部署RocketMQ可以按照以下步驟進行&#xff1a; 1. 安裝Docker 首先&#xff0c;確保Docker已經安裝在你的系統上。 更新系統包并安裝依賴項&#xff1a; sudo yum update -y sudo yum install -y yum-utils device-mapper-persiste…