Spring 4 支持的 Java 8 特性
Spring 框架 4 支持 Java 8 語(yǔ)言和 API 功能。在本文中,我們將重點(diǎn)放在 Spring 4 支持新的 Java 8 的功能。最重要的是 Lambda 表達(dá)式,方法引用,JSR-310的日期和時(shí)間,和可重復(fù)注釋。
Lambda 表達(dá)式
Spring 的代碼庫(kù)使用了 Java 8 大量的函數(shù)式接口,Lambda 表達(dá)式可以用來(lái)編寫(xiě)更干凈和緊湊的代碼。每當(dāng)出現(xiàn)函數(shù)式接口的對(duì)象的預(yù)期時(shí)我們便可以提供一個(gè) Lambda 表達(dá)式。讓我們進(jìn)一步繼續(xù)之前首先學(xué)習(xí)函數(shù)式接口。
函數(shù)式接口
有單一抽象方法的接口被稱(chēng)為函數(shù)式接口。下面是 JDK 中函數(shù)式接口的一些例子:
Comparator 是僅具有一個(gè)抽象的非對(duì)象方法的函數(shù)。盡管聲明了兩個(gè)抽象方法,因?yàn)?equals 是對(duì)應(yīng)于對(duì)象的公共方法所以從計(jì)數(shù)里排除了。其中有一個(gè)對(duì)象類(lèi)方法且沒(méi)有非對(duì)象方法的接口并不是函數(shù)式接口。
一個(gè)接口如果有一個(gè)抽象的非對(duì)象類(lèi)方法并且擴(kuò)展自具有唯一對(duì)象類(lèi)方法的非函數(shù)式接口,則稱(chēng)為函數(shù)式接口。
Spring 框架的函數(shù)式接口的例子:
@FunctionalInterface 注解可以在接口聲明的頂部聲明中被使用,但這并不是必需的。此注解用于由編譯器來(lái)檢測(cè)該接口是不是有效的函數(shù)式接口。如果我們?cè)噲D在接口里定義多個(gè)單一抽象方法,編譯器將拋出一個(gè)錯(cuò)誤。
函數(shù)描述符
接口的函數(shù)描述符是該接口的一個(gè)抽象方法的方法的類(lèi)型。該方法類(lèi)型包括參數(shù)類(lèi)型,返回類(lèi)型和 throws 子句。
例:
如何編寫(xiě) Lambda 表達(dá)式
Lambda 表達(dá)式的語(yǔ)法可以拆分成三部分:
- 一個(gè)箭頭 (–>)
- 參數(shù)列表: 一個(gè) Lambda 表達(dá)式可以包含0個(gè)或多個(gè)參數(shù) 例: () → { 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); }
- 表達(dá)式體: 可以是單個(gè)表達(dá)式或代碼塊。單個(gè)表達(dá)式將被簡(jiǎn)單地求值并返回。 例: (String arg) → { System.out.println(“ One argument : ”+arg); } 如果表達(dá)式體(Body)中存在語(yǔ)句塊,那么它將被判定為方法體,并且在塊執(zhí)行后隱藏的返回語(yǔ)句將控制權(quán)交給調(diào)用者。
現(xiàn)在我們看一下如何使用 Lambda 表達(dá)式:
例1:
// 使用 Lambda 表達(dá)式
例2:
//使用 Lambda 表達(dá)式
你可以通過(guò) Spring 的回調(diào)函數(shù)使用 Lambda 表達(dá)式。例如,用一個(gè) ConnectionCallback 檢索給定 JDBC 連接的列表,可寫(xiě)成如下語(yǔ)句: jdbcTemplate.execute(connection -> connection.getCatalog())
方法引用
函數(shù)式接口也可以使用方法引用來(lái)實(shí)現(xiàn),引用方法或構(gòu)造函數(shù)但并不調(diào)用它們。方法引用和 Lambda 表達(dá)式是類(lèi)似的,但方法引用是指現(xiàn)有類(lèi)的方法,而 Lambda 定義了一個(gè)匿名方法,并將其作為函數(shù)式接口的實(shí)例。
在 Java 8 中一個(gè)新增包中包含了常用于 Lambda 表達(dá)式和方法引用的函數(shù)式接口:java.util.function。
Date Time API
在 Java 中現(xiàn)有的 Date 和 Time 類(lèi)存在多個(gè)問(wèn)題。Date 和 Calendar 類(lèi)的最大問(wèn)題之一是它們不是線(xiàn)程安全的。在編寫(xiě)日期處理代碼時(shí)開(kāi)發(fā)人員不得不特別小心并發(fā)問(wèn)題。Date 類(lèi)也不支持國(guó)際化,因此不支持時(shí)區(qū)。開(kāi)發(fā)人員必須編寫(xiě)大量的代碼來(lái)支持不同的時(shí)區(qū)。
Date 和 Time 類(lèi)也顯現(xiàn)出不佳的 API 設(shè)計(jì)。java.util.Date 中的月從0,日從1,年從1900開(kāi)始。缺少一致性?,F(xiàn)在這些與 Date 和 Time 類(lèi)的其它幾個(gè)問(wèn)題在 Java 8 中的新 Date 和 Time API 中已解決。
在 java.time 包下新的 Date 和 Time API 的重要的類(lèi)是 LocalDate,LocalTime 和 ZonedDateTime。
LocalDate 和 LocalTime
LocalDate 表示日期時(shí)的默認(rèn)格式為 YYYY-MM-DD,并沒(méi)有時(shí)間。這是一個(gè)不可變類(lèi)。我們可以使用 now() 方法獲得的當(dāng)前日期。
新建 LocalDate 實(shí)例的例子:
//獲取當(dāng)前日期
我們也可以通過(guò)對(duì)年,月,日的輸入?yún)?shù)來(lái)新建 LocalDate 實(shí)例。
// 2016年4月1日
LocalTime 表示無(wú)日期的時(shí)間,是不變的。時(shí)間的默認(rèn)格式為 hh:mm:ss.zzz。
新建 LocalTime 實(shí)例的例子:
//獲取當(dāng)前時(shí)間
// 18:30:30
默認(rèn)情況下,LocalDate 和 LocalTime 類(lèi)使用默認(rèn)時(shí)區(qū)的系統(tǒng)時(shí)鐘。這些類(lèi)還提供了通過(guò)重載 new() 方法對(duì)修改時(shí)區(qū)的支持??梢酝ㄟ^(guò)傳遞 zoneid 來(lái)獲得一個(gè)特定時(shí)區(qū)中的日期。
例子:
// 當(dāng)前本地日期加爾各答(印度)
此外,還有一個(gè)類(lèi),LocalDateTime 組合了日期和時(shí)間,默認(rèn)格式為 yyyy-MM-ddTHH:MM:ss.zzz·。
//當(dāng)前日期和時(shí)間
// 2016-04-01 13:30
ZonedDateTime
這是一個(gè)不可變的類(lèi),用于表示包括時(shí)區(qū)信息的日期和時(shí)間。我們可以使用這個(gè)類(lèi)的一個(gè)實(shí)例來(lái)表示特定事件,如在世界的某些地區(qū)一個(gè)會(huì)議。
// 當(dāng)前時(shí)間使用系統(tǒng)的時(shí)間和默認(rèn)區(qū)域
// 當(dāng)前時(shí)間使用特定時(shí)區(qū)的系統(tǒng)時(shí)鐘
Spring 4 提供了一個(gè)轉(zhuǎn)換框架,支持做為 Java 8 日期和時(shí)間 API 一部分的所有類(lèi)。Spring 4 可以使用一個(gè) 2016-9-10 的字符串,并把它轉(zhuǎn)換成 Java 8 LocalDate 的一個(gè)實(shí)例。Spring 4 還支持通過(guò) @DateTimeFormat 注解格式化 Java 8 Date-Time 字段。@DateTimeFormat 聲明一個(gè)字段應(yīng)該格式化為日期時(shí)間。
重復(fù)注解
在 Java 8 之前,將相同類(lèi)型的多個(gè)注釋加到聲明或類(lèi)型(例如一個(gè)類(lèi)或方法)中是不允許的。作為一種變通方法,開(kāi)發(fā)人員不得不將它們組合在一起成為單個(gè)容器注解。
例:
重復(fù)注解允許我們重寫(xiě)相同的代碼并不需顯式地使用容器注解。雖然容器注解沒(méi)有在這里使用的,Java 編譯器負(fù)責(zé)將兩個(gè)注解封裝成一個(gè)容器:
例:
定義重復(fù)注解
定義一個(gè)重復(fù)注解,通過(guò)可重復(fù)使用的 @Repeatable 注解來(lái)進(jìn)行標(biāo)注,或創(chuàng)建一個(gè)具有重復(fù)注解類(lèi)型系列屬性的注解。
第1步:聲明重復(fù)注解類(lèi)型:
第2步:聲明容器注解類(lèi)型。
全部的實(shí)現(xiàn)如下所示:
為了獲得在運(yùn)行時(shí)的注解信息,通過(guò) @Retention(RetentionPolicy.RUNTIME) 注釋即可。
檢索注解
getAnnotationsByType() 或 getDeclaredAnnotationsByType() 是用于訪(fǎng)問(wèn)注解反射 API 中的新方法。
注解還可以通過(guò)它們的容器注解用 getAnnotation() 或 getDeclaredAnnotation() 進(jìn)行訪(fǎng)問(wèn)。
結(jié)論
Spring 4 還可運(yùn)行在 Java 6 和 Java 7 中。由于 Spring 使用了很多的函數(shù)式接口,用 Java 8 和 Spring 4,你將能夠使用 Lambda 表達(dá)式和函數(shù)式接口,并可寫(xiě)出更干凈、緊湊的代碼。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- Spring事物的傳播特性詳解
- Spring Boot 2.4新特性減少95%內(nèi)存占用問(wèn)題
- Spring Boot 2.4 新特性之一鍵構(gòu)建Docker鏡像的過(guò)程詳解
- spring5新特性全面介紹
- SpringBoot新特性之全局懶加載機(jī)制
- 全面解析Spring Security 過(guò)濾器鏈的機(jī)制和特性
- SpringBoot2.3新特性?xún)?yōu)雅停機(jī)詳解
- Spring MVC接受表單自動(dòng)封裝特性實(shí)例解析
- SpringBoot2.0新特性之配置綁定全解析
- Spring各版本新特性的介紹
- Intellij IDEA 2017新特性之Spring Boot相關(guān)特征介紹
- 簡(jiǎn)單了解Spring Framework5.0新特性
- spring4新特性之web開(kāi)發(fā)增強(qiáng)
- 淺析Spring4新特性概述
- java Spring 5 新特性函數(shù)式Web框架詳細(xì)介紹
- 詳解Spring工廠(chǎng)特性
相關(guān)文章
Java 在Excel中添加分離型餅圖、環(huán)形圖的方法
這篇文章主要介紹了Java 在Excel中添加分離型餅圖、環(huán)形圖的方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-12-12java通過(guò)控制鼠標(biāo)實(shí)現(xiàn)屏幕廣播的方法
這篇文章主要介紹了java通過(guò)控制鼠標(biāo)實(shí)現(xiàn)屏幕廣播的方法,針對(duì)前面一篇Java屏幕共享功能進(jìn)行了改進(jìn),實(shí)現(xiàn)了鼠標(biāo)控制功能,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12使用Spring Data Redis實(shí)現(xiàn)數(shù)據(jù)緩存的方法
目前在系統(tǒng)架構(gòu)設(shè)計(jì)中使用Redis實(shí)現(xiàn)緩存,這篇文章主要介紹了使用Spring Data Redis實(shí)現(xiàn)數(shù)據(jù)緩存的方法,具有一定的參考價(jià)值,需要的朋友可以參考下2018-11-11Java隨機(jī)數(shù)算法原理與實(shí)現(xiàn)方法實(shí)例詳解
這篇文章主要介紹了Java隨機(jī)數(shù)算法原理與實(shí)現(xiàn)方法,簡(jiǎn)單分析了隨機(jī)數(shù)算法的原理并結(jié)合具體實(shí)例形式給出了java編程計(jì)算隨機(jī)數(shù)的具體操作技巧,需要的朋友可以參考下2017-09-09java根據(jù)網(wǎng)絡(luò)地址保存圖片的方法
這篇文章主要為大家詳細(xì)介紹了java根據(jù)網(wǎng)絡(luò)地址保存圖片的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07詳解java實(shí)現(xiàn)HTTP請(qǐng)求的三種方式
這篇文章主要介紹了java實(shí)現(xiàn)HTTP請(qǐng)求的三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04java中ThreadLocal和ThreadLocalMap淺析
這篇文章主要介紹了java中ThreadLocal和ThreadLocalMap淺析,ThreadLocal類(lèi)用來(lái)設(shè)置線(xiàn)程私有變量?本身不儲(chǔ)存值?主要提供自身引用?和?操作ThreadLocalMap?屬性值得方法,需要的朋友可以參考下2023-09-09