Spring 框架 4 支援 Java 8 語言和 API 功能。在本文中,我們將重點放在 Spring 4 支援新的 Java 8 的功能。最重要的是 Lambda 表達式,方法引用,JSR-310的日期和時間,和可重複註解。下面跟著小編一起來看吧
Spring 框架 4 支援 Java 8 語言和 API 功能。在本文中,我們將重點放在 Spring 4 支援新的 Java 8 的功能。最重要的是 Lambda 表達式,方法引用,JSR-310的日期和時間,和可重複註解。
Lambda 表達式
Spring 的程式碼庫使用了 Java 8 大量的函數式接口,Lambda 表達式可以用來編寫更乾淨和緊湊的程式碼。每當出現函數式介面的物件的預期時我們便可以提供一個 Lambda 表達式。讓我們進一步繼續之前先學習函數式介面。
函數式介面
有單一抽象方法的介面稱為函數式介面。以下是JDK 中函數式介面的一些範例:
Comparator 是僅具有一個抽象的非物件方法的函數。儘管宣告了兩個抽象方法,因為 equals 是對應於物件的公共方法所以從計數中排除了。其中有一個物件類別方法且沒有非物件方法的介面並不是函數式介面。
一個介面如果有一個抽象的非物件類別方法並且擴展自具有唯一物件類別方法的非函數式接口,則稱為函數式接口。
Spring 框架的函數式介面的範例:
@FunctionalInterface註解可以在介面聲明的頂部聲明中被使用,但這並不是必要的。此註解用於由編譯器來檢測該介面是不是有效的函數式介面。如果我們試圖在介面裡定義多個單一抽象方法,編譯器將會拋出一個錯誤。
函式描述子
介面的函數描述子是該介面的一個抽象方法的方法的類型。此方法類型包括參數類型,傳回類型和 throws 子句。
範例:
如何寫Lambda 表達式
Lambda 表達式的語法可以拆分成三部分:
一個箭頭(–>)
#參數清單: 一個Lambda 表達式可以包含0個或多個參數範例:
() → { System.out.println(“ No arguments”); } (String arg) → { System.out.println(“ One argument : ”+arg); } (String arg1, Integer arg2) → { System.out.println(“Two arguments : ”+arg1+” and ”+arg2); }
表達式體: 可以是單一表達式或程式碼區塊。單一表達式將被簡單地求值並傳回。 例: (String arg) → { System.out.println(“ One argument : ”+arg); } 如果表達式體(Body)中存在語句區塊,那麼它將被判定為方法論體,並且在區塊執行後隱藏的回傳語句將控制權交給呼叫者。
現在我們來看看如何使用Lambda 運算式:
#範例1:
// 使用Lambda表達式
範例2:
//使用Lambda 表達式
你可以透過Spring 的回呼函數使用Lambda 表達式。例如,用一個 ConnectionCallback 檢索給定 JDBC 連線的列表,可寫成如下語句: jdbcTemplate.execute(connection -> connection.getCatalog())
方法參考
函數式介面也可以使用方法參考來實現,引用方法或建構子但並不會呼叫它們。方法參考和 Lambda 表達式是類似的,但方法參考是指現有類別的方法,而 Lambda 定義了一個匿名方法,並將其作為函數式介面的實例。
在 Java 8 中一個新增套件中包含了常用於 Lambda 表達式和方法引用的函數式介面:java.util.function。
Date Time API
在 Java 中現有的 Date 和 Time 類別存在多個問題。 Date 和 Calendar 類別的最大問題之一是它們不是線程安全的。在編寫日期處理程式碼時開發人員不得不特別小心並發問題。 Date 類別也不支援國際化,因此不支援時區。開發人員必須編寫大量的程式碼來支援不同的時區。
Date 和 Time 類別也顯現出不佳的 API 設計。 java.util.Date 中的月從0,日從1,年從1900開始。缺少一致性。現在這些與 Date 和 Time 類別的其它幾個問題在 Java 8 中的新 Date 和 Time API 中已解決。
在 java.time 套件下新的 Date 和 Time API 的重要的類別是 LocalDate,LocalTime 和 ZonedDateTime。
LocalDate 和 LocalTime
LocalDate 表示日期時的預設格式為 YYYY-MM-DD,沒有時間。這是一個不可變類別。我們可以使用 now() 方法獲得的當前日期。
新建LocalDate 實例的範例:
//取得目前日期
#我們也可以通過對年,月,日的輸入參數來新建LocalDate 實例。
// 2016年4月1日
#LocalTime 表示無日期的時間,是不變的。時間的預設格式為 hh:mm:ss.zzz。
新LocalTime 實例的範例:
//取得目前時間
#// 18:30:30
#預設情況下,LocalDate 和LocalTime 類別使用預設時區的系統時脈。這些類別也提供了透過重載 new() 方法對修改時區的支援。可以透過傳遞 zoneid 來獲得一個特定時區中的日期。
範例:
// 當前本地日期加爾各答(印度)
#此外,還有一個類,LocalDateTime 組合了日期和時間,預設格式為yyyy-MM-ddTHH:MM:ss.zzz·。
//目前日期和時間
// 2016-04-01 13:30
ZonedDateTime
這是一個不可變的類,用來表示包含時區資訊的日期和時間。我們可以使用這個類別的一個實例來表示特定事件,如在世界的某些地區一個會議。
// 目前時間使用系統的時間和預設區域
// 目前時間使用特定時區的系統時鐘
Spring 4 提供了一個轉換框架,支援做為Java 8 日期和時間API 一部分的所有類別。 Spring 4 可以使用一個 2016-9-10 的字串,並且把它轉換成 Java 8 LocalDate 的一個實例。 Spring 4 也支援透過 @DateTimeFormat 註解格式化 Java 8 Date-Time 欄位。 @DateTimeFormat 聲明一個欄位應該格式化為日期時間。
重複註解
在Java 8 之前,將相同類型的多個註解加到宣告或型別(例如一個類或方法)中是不允許的。作為一種變通方法,開發人員不得不將它們組合在一起成為單一容器註解。
範例:
重複註解允許我們重寫相同的程式碼並不需明確地使用容器註解。雖然容器註解沒有在這裡使用的,Java 編譯器負責將兩個註解封裝成一個容器:
#範例:
# #定義重複註解
定義一個重複註解,透過可重複使用的@Repeatable 註解來進行標註,或建立一個具有重複註解類型系列屬性的註解。
第1步:宣告重複註解類型:
第2步:聲明容器註解類型。
全部的實作如下所示:
為了得到在執行時的註解訊息,透過@Retention(RetentionPolicy.RUNTIME) 註釋即可。
檢索註解############getAnnotationsByType() 或 getDeclaredAnnotationsByType() 是用於存取註解反射 API 中的新方法。 ######註解也可以透過它們的容器註解用 getAnnotation() 或 getDeclaredAnnotation() 進行存取。 #########結論#########Spring 4 也可運行在 Java 6 和 Java 7 中。由於 Spring 使用了很多的函數式接口,用 Java 8 和 Spring 4,你將能夠使用 Lambda 表達式和函數式接口,並可寫出更乾淨、緊湊的程式碼。 ###以上是詳細介紹Spring4支援的Java8特性(圖)的詳細內容。更多資訊請關注PHP中文網其他相關文章!