Spring 4 支援的 Java 8 功能

2016-12-31    分類:JAVA開發、程式設計開發、首頁精華0人評論發表於2016-12-31

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

Spring Framework 4支援Java 8語言和API功能。在本文中,我們將關注Spring 4支援的新Java 8功能。最重要的是lambda表示式、方法引用、JSR-310 Date and Time以及可重複註釋。

Lambda表示式

Spring程式碼庫使用了大量的函式式介面,使用Java 8,我們可以使用lambda表示式編寫更乾淨、更緊湊的程式碼。每當期望函式式介面的物件時,我們就可以供給lambda表示式。讓我們在講下一個內容之前先了解函式式介面。

函式式介面

具有單個抽象方法的介面可以被稱為函式式介面。這裡有一些JDK函式式介面的例子:

比較程式是函式式的,因為它只有一個抽象非Object方法。雖然它宣告瞭兩個抽象方法,’equals’是對應Object中public的方法,因此從計數中排除。具有Object類方法而沒有非Object方法的介面不是函式式介面。

如果介面具有抽象的非物件類方法並擴充套件了一個只有物件類方法的非函式式介面,則該介面是函式式的。

Spring框架函式式介面的示例:

FunctionalInterface註釋可以在介面宣告的頂部使用,但它不是強制的。編譯器使用此註釋來檢測介面是否是有效的函式式介面。如果我們嘗試定義不止單個的抽象方法到介面,那麼編譯器會丟擲錯誤。

函式描述符

介面的函式描述符是介面單個抽象方法的方法型別。方法型別包括引數型別,返回型別和throws子句。

例子:

介面 描述符
Runnable () -> void
Comparable T -> int
Comparator (T, T) -> int
interface A { void foo() throws IOException; }
interface B { void foo() throws EOFException; }
interface AB extends A, B {}
AB介面的描述符:
() -> void throws EOFException
interface X {
List<String> bar(List<String> arg) throws IOException, SQLTransientException;
}
interface Y {
List bar(List<String> arg) throws EOFException, SQLException;

}

interface Z extends X, Y {}
Z介面的描述符:
(List<String>)->List<String> throws EOFException, SQLTransientException // EOFException extends IOException, and SQLTransientException extends SQLException.

如何編寫Lambda表示式

Lambda表示式語法可以分為三部分:

箭頭( – >)

引數列表:

lambda表示式可以包含零個或多個引數,例如:

() → { 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); }

如果主體有語句塊,那麼它將被評估為方法體,並且隱藏的返回語句將在塊執行後將控制返回給呼叫者。

現在讓我們來看看如何使用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和Calendar類最大的問題之一是它們不是執行緒安全的。開發人員不得不在處理日期處理程式碼時小心併發問題。Date類也不支援國際化,因此不支援時區。開發人員必須編寫大量程式碼來支援各種時區。

Date和Time類也凸顯了API設計的差勁。java.util.Date中的月份以0開頭,日期以1開頭,年份以1900開頭。沒有統一性。這些和其他若干Date和Time類中的問題通過Java 8 中Date and Time API得到解決。

java.time包下新的Date and Time API中,重要的類是LocalDate,LocalTime和ZonedDateTime。

LocalDate和LocalTime

LocalDate表示不帶時間,預設格式為yyyy-MM-dd的Date。它是一個不可變的類。我們可以使用now()方法獲取當前日期。

建立新的LocalDate例項的例子:

//獲取當前日期

我們還可以傳遞年月日的輸入引數來建立LocalDate例項。

// 2016-04-01

LocalTime代表不可變的,不帶日期的時間。時間的預設格式為hh:mm:ss.zzz。

建立新的LocalTime例項的例子:

//獲取當前時間

// 18:30:30

預設情況下,LocalDate和LocalTime類在預設時區中使用系統時鐘。這些類還通過過載的now()方法提供對時區的支援。我們可以傳遞ZoneId在特定時區獲取日期。

例子:

//加爾各答(印度)的當前日期

另外,還有一個類,LocalDateTime ,它將日期和時間以預設格式yyyy-MM-ddTHH:mm:ss.zzz組合起來。

//當前日期和時間

// 2016-04-01 13:30

ZonedDate Time

這是一個不可變的類,表示日期和時間,包括時區資訊。我們可以使用這個類的例項來表示特定事件,如世界的某些地方的會議。

//使用系統時間和預設區域的當前時間

//使用特定時區系統時鐘的當前時間

Spring 4提供了一個轉換框架,支援作為Java 8 Date and Time API一部分的所有類。Spring 4可以採用格式為2016-09-10的字串,並將其轉換為Java 8 LocalDate的例項。Spring 4還支援格式化Java 8日期時間欄位,用@DateTimeFormat註釋。@DateTimeFormat宣告欄位應該格式化為日期時間。

重複註釋

在Java 8之前,不允許將相同型別的多個註釋附加到宣告或型別(例如類或方法)。作為解決方法,開發人員必須將它們組合到單個容器註釋中。

舉例:

重複註釋允許我們重寫相同的程式碼,而不顯式地使用容器註釋。雖然此處未使用容器註釋,但Java編譯器負責將兩個註釋包裝到容器中:

舉例:

定義重複註釋

要定義重複註釋,標記可以使用@Repeatable重複的註釋,並建立一個屬性是重複註釋型別的陣列的註釋。

步驟1:宣告可重複註釋型別:

步驟2:宣告容器註釋型別。

完全實現如下:

要在執行時獲取註釋資訊,用@Retention(RetentionPolicy.RUNTIME)註釋Roles。

檢索註釋

getAnnotationsByType()或getDeclaredAnnotationsByType()是用於訪問註釋的Reflection API中的新方法。

註釋也可以使用getAnnotation()或getDeclaredAnnotation()通過容器註釋來訪問。

結論

Spring 4仍然使用Java 6和Java 7執行。由於Spring使用了大量的函式式介面,使用Java 8和Spring 4,你將能夠使用lambda表示式——擁有函式式介面,並且可以編寫更乾淨和緊湊的程式碼。

新的 Date and Time API解決了java.Util.Date類的長期問題,並引入了許多新的類,如LocalDate,LocalTime,這將使得日期和時間的程式設計更愉快。你已經採用Java 8與Spring 4了嗎?請與我們分享各位的反饋。

譯文連結:http://www.codeceo.com/article/spring-4-java8-feature.html
英文原文:Java 8 Features Supported by Spring 4
翻譯作者:碼農網 – 小峰
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章