首頁 Java java教程 詳細介紹Spring4支援的Java8特性(圖)

詳細介紹Spring4支援的Java8特性(圖)

Mar 21, 2017 am 10:48 AM
java8

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 中函數式介面的一些範例:

詳細介紹Spring4支援的Java8特性(圖)

詳細介紹Spring4支援的Java8特性(圖)

詳細介紹Spring4支援的Java8特性(圖)

Comparator 是僅具有一個抽象的非物件方法的函數。儘管宣告了兩個抽象方法,因為 equals 是對應於物件的公共方法所以從計數中排除了。其中有一個物件類別方法且沒有非物件方法的介面並不是函數式介面。

詳細介紹Spring4支援的Java8特性(圖)

一個介面如果有一個抽象的非物件類別方法並且擴展自具有唯一物件類別方法的非函數式接口,則稱為函數式接口。

詳細介紹Spring4支援的Java8特性(圖)

Spring 框架的函數式介面的範例:

詳細介紹Spring4支援的Java8特性(圖)

詳細介紹Spring4支援的Java8特性(圖)

@FunctionalInterface註解可以在介面聲明的頂部聲明中被使用,但這並不是必要的。此註解用於由編譯器來檢測該介面是不是有效的函數式介面。如果我們試圖在介面裡定義多個單一抽象方法,編譯器將會拋出一個錯誤。

詳細介紹Spring4支援的Java8特性(圖)

詳細介紹Spring4支援的Java8特性(圖)

函式描述子

介面的函數描述子是該介面的一個抽象方法的方法的類型。此方法類型包括參數類型,傳回類型和 throws 子句。

範例:

詳細介紹Spring4支援的Java8特性(圖)

如何寫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:

詳細介紹Spring4支援的Java8特性(圖)

// 使用Lambda表達式

詳細介紹Spring4支援的Java8特性(圖)

範例2:

詳細介紹Spring4支援的Java8特性(圖)

//使用Lambda 表達式

詳細介紹Spring4支援的Java8特性(圖)

你可以透過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 實例的範例:

//取得目前日期

詳細介紹Spring4支援的Java8特性(圖)

#我們也可以通過對年,月,日的輸入參數來新建LocalDate 實例。

// 2016年4月1日

詳細介紹Spring4支援的Java8特性(圖)

#LocalTime 表示無日期的時間,是不變的。時間的預設格式為 hh:mm:ss.zzz。

新LocalTime 實例的範例:

//取得目前時間

詳細介紹Spring4支援的Java8特性(圖)

#// 18:30:30

詳細介紹Spring4支援的Java8特性(圖)

#預設情況下,LocalDate 和LocalTime 類別使用預設時區的系統時脈。這些類別也提供了透過重載 new() 方法對修改時區的支援。可以透過傳遞 zoneid 來獲得一個特定時區中的日期。

範例:

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

詳細介紹Spring4支援的Java8特性(圖)

#此外,還有一個類,LocalDateTime 組合了日期和時間,預設格式為yyyy-MM-ddTHH:MM:ss.zzz·。

//目前日期和時間

詳細介紹Spring4支援的Java8特性(圖)

// 2016-04-01 13:30

詳細介紹Spring4支援的Java8特性(圖)

ZonedDateTime

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

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

詳細介紹Spring4支援的Java8特性(圖)

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

詳細介紹Spring4支援的Java8特性(圖)

Spring 4 提供了一個轉換框架,支援做為Java 8 日期和時間API 一部分的所有類別。 Spring 4 可以使用一個 2016-9-10 的字串,並且把它轉換成 Java 8 LocalDate 的一個實例。 Spring 4 也支援透過 @DateTimeFormat 註解格式化 Java 8 Date-Time 欄位。 @DateTimeFormat 聲明一個欄位應該格式化為日期時間。

詳細介紹Spring4支援的Java8特性(圖)

重複註解

在Java 8 之前,將相同類型的多個註解加到宣告或型別(例如一個類或方法)中是不允許的。作為一種變通方法,開發人員不得不將它們組合在一起成為單一容器註解。

範例:

詳細介紹Spring4支援的Java8特性(圖)

重複註解允許我們重寫相同的程式碼並不需明確地使用容器註解。雖然容器註解沒有在這裡使用的,Java 編譯器負責將兩個註解封裝成一個容器:

#範例:

詳細介紹Spring4支援的Java8特性(圖)

# #定義重複註解

詳細介紹Spring4支援的Java8特性(圖)

定義一個重複註解,透過可重複使用的@Repeatable 註解來進行標註,或建立一個具有重複註解類型系列屬性的註解。

第1步:宣告重複註解類型:詳細介紹Spring4支援的Java8特性(圖)

詳細介紹Spring4支援的Java8特性(圖)

第2步:聲明容器註解類型。

全部的實作如下所示:

為了得到在執行時的註解訊息,透過@Retention(RetentionPolicy.RUNTIME) 註釋即可。

檢索註解############getAnnotationsByType() 或 getDeclaredAnnotationsByType() 是用於存取註解反射 API 中的新方法。 ######註解也可以透過它們的容器註解用 getAnnotation() 或 getDeclaredAnnotation() 進行存取。 #########結論#########Spring 4 也可運行在 Java 6 和 Java 7 中。由於 Spring 使用了很多的函數式接口,用 Java 8 和 Spring 4,你將能夠使用 Lambda 表達式和函數式接口,並可寫出更乾淨、緊湊的程式碼。 ###

以上是詳細介紹Spring4支援的Java8特性(圖)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 8中如何計算一年前或一年後的日期? Java 8中如何計算一年前或一年後的日期? Apr 26, 2023 am 09:22 AM

Java8計算一年前或一年後的日期利用minus()方法計算一年前的日期packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[]args ){LocalDatetoday=LocalDate.now();LocalDatepreviousYear=today.minus(1,ChronoUni

如何使用Java 8計算一週後的日期? 如何使用Java 8計算一週後的日期? Apr 21, 2023 pm 11:01 PM

Java8如何計算一週後的日期這個例子會計算一週後的日期。 LocalDate日期不包含時間訊息,它的plus()方法用來增加天、週、月,ChronoUnit類別宣告了這些時間單位。由於LocalDate也是不變型,回傳後一定要用變數賦值。 packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo08{publicstaticvoidmain(String[

Java8中Clock時鐘類別怎麼用 Java8中Clock時鐘類別怎麼用 Apr 25, 2023 pm 03:37 PM

Java8的Clock時鐘類別Java8增加了一個Clock時鐘類別用於取得當時的時間戳,或目前時區下的日期時間資訊。以前用到System.currentTimeInMillis()和TimeZone.getDefault()的地方都可用Clock替換。 packagecom.shxt.demo02;importjava.time.Clock;publicclassDemo10{publicstaticvoidmain(String[]args){//Returnsthecurrenttimebase

Java8中如何處理時區 Java8中如何處理時區 Apr 27, 2023 pm 09:22 PM

Java8中處理時區Java8不只分離了日期和時間,也把時區分開了。現在有一系列單獨的類別如ZoneId來處理特定時區,ZoneDateTime類別來表示某時區下的時間。這在Java8以前都是GregorianCalendar類別來做的。下面這個例子顯示如何把本時區的時間轉換成另一個時區的時間。 packagecom.shxt.demo02;importjava.time.LocalDateTime;importjava.time.ZoneId;importjava.time.ZonedDateT

在Java8中如何取得目前的時間戳 在Java8中如何取得目前的時間戳 May 01, 2023 am 11:46 AM

在Java8中取得目前的時間戳記Instant類別有一個靜態工廠方法now()會傳回目前的時間戳,如下所示:packagecom.shxt.demo02;importjava.time.Instant;publicclassDemo16{publicstaticvoidmain(String[]args) {Instanttimestamp=Instant.now();System.out.println("Whatisvalueofthisinstant"+timestamp.t

Java8中如何使用預先定義的格式化工具去解析或格式化日期 Java8中如何使用預先定義的格式化工具去解析或格式化日期 Apr 28, 2023 pm 07:40 PM

Java8中如何使用預先定義的格式化工具去解析或格式化日期packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.format.DateTimeFormatter;publicclassDemo17{publicstaticvoidmain(String[]args){StringdayAfterTommorrow="201802055 ";LocalDateformatted=LocalDate.parse

Java8中如何取得今天的日期 Java8中如何取得今天的日期 May 01, 2023 pm 06:49 PM

Java8中取得今天的日期Java8中的LocalDate用來表示當天日期。和java.util.Date不同,它只有日期,不包含時間。當你只需要表示日期時就用這個類別。 packagecom.shxt.demo02;importjava.time.LocalDate;publicclassDemo01{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();System.out.println("今天的日期:&q

Java8中日期比較方法有哪些 Java8中日期比較方法有哪些 Apr 29, 2023 pm 04:46 PM

Java8日期比較方法在Java8中,可以使用新的isBefore(),isAfter(),isEqual()和compareTo()來比較LocalDate,LocalTime和LocalDateTime。以下範例以比較兩個java.time.LocalDate@TestvoidtestDateCompare4()throwsParseException{DateTimeFormattersdf=DateTimeFormatter.ofPattern("yyyy-MM-dd&quot

See all articles