# JDK 17 心得分享 ### 分享動機 由於從++Spring Boot 3.0++開始,會強制要求使用==JDK 17==以上的Java開發版本,所以為了日後可能會遇到客戶專案是使用JDK 17做開發或維護,因此開始熟悉JDK 17。 --- ### 從JDK 8出發 #### Lambda 表達式 在JDK 8之前(ex: 7、6...),某些開發需求下,會需要使用匿名函數,像是: ```java= public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("Hello world!"); } }); thread.start(); } ``` 在JDK 8的環境下,就可以這樣寫: ```java= public static void main(String[] args) { Thread thread = new Thread(() -> { System.out.println("Hello world!"); }); thread.start(); } ``` 再舉一個例子: ```java= /** * 某個interface, * 有一個抽象方法intToString, * 需要傳入int資料型態, * 返回String資料型態。 */ public interface MyPrint { String intToString(int i); } public static void main(String[] args) { // 實作一 MyPrint mp1 = (int i) -> { return i+"_mp1"; }; System.out.println(mp1.intToString(123)); // 輸出結果:123_mp1 // 實作二 // 優化實作一,省略參數類型int MyPrint mp2 = (i) -> { return i+"_mp2"; }; // 實作三 // 優化實作二,只有一個參數時,可以省略小括號() MyPrint mp3 = i -> { return i+"_mp3"; }; // 實作四 // 優化實作三,只有一行處理過程時,可以省略大括號{} & return MyPrint mp4 = i -> i+"_mp4"; } ``` [Github的原始碼(Case 1)](https://github.com/sparklin9092/JavaProject/blob/main/src/my_case/Case_1.java) #### Optional 常用於處理null的情況,避免程式執行後拋出++java.lang.NullPointerException++。 ```java= public static void myMethod(String str) { System.out.println(str.toLowerCase()); } public static void main(String[] args) { String tempStr = null; myMethod(tempStr); } ``` [Github的原始碼(Case 2)](https://github.com/sparklin9092/JavaProject/blob/main/src/my_case/Case_2.java) 以上案例中,由於傳入==tempStr==變數時,缺少if判斷式去排除null的情況,所以會直接拋出java.lang.NullPointerException。 以下進行邏輯優化: ```java= public static void print(String str) { System.out.println(str.toLowerCase()); } public static void main(String[] args) { String tempStr = null; Optional.ofNullable(tempStr).ifPresent(s -> print(s)); String tempStr2 = "JAVA"; Optional.ofNullable(tempStr2).ifPresent(s -> print(s)); } ``` [Github的原始碼(Case 3)](https://github.com/sparklin9092/JavaProject/blob/main/src/my_case/Case_3.java) 在JDK 8的開發環境下,使用Optional處理變數,避免程式邏輯拋出NullPointerException。 --- ### 路過JDK 11 從熟悉的JDK 8環境來到另一個與JDK 8一樣,是支持LTS(長期維護版本)的JDK 11,在JDK 17出現之前,是另一個比較廣泛使用的版本。 #### 強化對String資料型態的功能 & var變數 ```java= public static void main(String[] args) { var tempStr = ""; System.out.println("tempStr is Blank? Ans: " + tempStr.isBlank()); // 輸出結果 “tempStr is Blank? Ans: true” var tempStr2 = "Case 4 "; System.out.println("tempStr2 is Empty? Ans: " + tempStr2.isEmpty()); // 輸出結果 “tempStr2 is Empty? Ans: false” } ``` [Github的原始碼(Case 4)](https://github.com/sparklin9092/JavaProject/blob/main/src/my_case/Case_4.java) 在JDK 11支援不定型態的var變數,但只能用在方法內,無法用在全域。 在JDK 8的開發環境下,判斷String是否為空值,需要import [Apache Commons Lang](https://commons.apache.org/proper/commons-lang),或是自行寫判斷式,而在JDK 11的開發環境下,String資料型態就有**isBlank**和**isEmpty**可以直接判斷空值和空白。 #### Http Client API 用來取代舊有的 ***HttpURLConnection***,HttpClient可支援HTTP2和WebSocket協定。