一、Java8常用的新特性總結
1.1.Java8常用特性總覽
1.2.lambda表示式
在Java8中引入了一個新的操作符“->”,該操作符稱為箭頭操作符或Lambda
操作符,左側:Lambda
表示式的引數列表,右側:Lambda
表示式中所要執行的功能,即把函式作為一個方法的引數,通常多用於匿名內部類的簡潔寫法,同時lambda
表示式也是更好的使用StreamAPI
的基礎。
1.3.函式式介面
介面中只有一個抽象方法的介面,就叫函式式介面。可以使用註解@FunctionalInterface
檢查是否為函式式介面。例如,我們可以定義一個處理一個數的的函式介面,數就是函式介面的引數,每次怎麼處理就是這個函式介面的實現,我們呼叫這個函式介面的時候就傳入要處理的數字和處理邏輯就可。簡單示例如下:
@FunctionalInterface
public interface MyFun {
public Integer getValue(Integer num);
}
複製程式碼
public Integer operation(Integer num,MyFun mf){
return mf.getValue(num);
}
複製程式碼
@Test
public void test5(){
Integer num = operation(100,(x)-> x*x);
System.out.println(num);
}
複製程式碼
四大核心函式介面
Consumer
消費型介面: 引數型別 T 返回型別void
對型別T的物件應用操作,Consumer
消費型是傳入一個引數,進行處理Supplier
供給型介面: 引數型別 無 返回型別 T 返回型別為T的物件,Supplier
供給型是得到一些結果Function<T,R>
函式型介面: 引數型別 T 返回型別 R 對了型別為T的物件應用操作,並返回結果,Function
函式型是傳入一個引數,處理後返回一個結果Predicate
斷言型介面: 引數型別 T 返回型別boolean
確定型別為T的物件是否滿足某約束,並返回布林值。Predicate
斷言型就是做一些判斷操作
1.4.方法引用和陣列引用
當要傳遞給Lambda體的操作,已經有了實現的方法,可以使用方法引用. (實現抽象方法的引數列表,必須與方法引用方法的引數列表保持一致)。 方法引用:使用操作符“::”將方法名和物件或類的名字分割開,例如:
- 物件::例項方法
- 類::靜態方法
- 類::例項方法
方法引用的實質就是使用更簡單的方式代替Lambda表示式
1.5.StreamAPI
這個可以說是我用的最多的啦,開發中集合的遍歷,分組,過濾,排序,判斷,篩選等等,Stream是Java8中處理集合的關鍵抽象概念,它可以指定你希望對集合進行測操作,可以執行非常複雜的查詢,過濾和對映資料的操作,使用Stream API對集合資料進行操作就類似於使用SQL執行的資料庫查詢查詢,Stream API提供了一種高效且易於使用的處理資料的方式。 流(Stream)是資料渠道,用於運算元據源(集合、陣列等)所生成的元素序列,“集合講的是資料,流講的是計算”,需要注意的是以下三點:
- Stream自己不會儲存元素
- Stream不會改變源物件,相會,他們會返回一個持有結果的新的Stream
- Stream操作是延遲執行的,這意味著他們會等到需要結果的時候才執行。
Stream使用方法
- 建立Stream:一個資料來源(集合、陣列)獲取一個流
- 中間操作:一箇中間操作鏈,對資料來源的資料進行處理
- 終止操作:一個終止操作,執行中間操作鏈,併產生結果。
1.6.LocalDateTime
LocalDateTime是一個不可變的日期時間物件,代表日期時間,通常被視為年 - 月 - 日 - 時 - 分 - 秒。這個也是在開發中使用的最多的,例如統計資料的時候根據時間分組後,統計當前季度或者下一季度的,或者獲取當前年月,再例如獲取當前月的第一天,當前月的最後的一天,下兩個月的最後一天等等,使用LocalDateTime
都可以很簡單的完成,舉個例子,根據出生日期計算年齡:
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE;
LocalDate csrq = LocalDate.parse(csrq, dtf);
LocalDate now = LocalDate.now();
return (int)ChronoUnit.YEARS.between(csrq, now);
複製程式碼
1.7.Optional
這個也可以說是一大神器啦,排除空指標異常呀,有時候自己寫的你還能注意點盼空,隨著微服務的使用,呼叫其他系統介面,你也不完全知道別人會給你返回個人什麼呀,之前我們可以使用三木運算判空或者if
判空,現在可以使用Optional
更加優雅的消除空指標。
1.8.Base64
這個雖然沒有之前的新特性用的多,但是在最近的專案開發中使用帶了,就順便記錄一下吧,
String text = "show me the code";
String encoded = Base64.getEncoder().encodeToString(text.getBytes(StandardCharsets.UTF_8));
String decoded = new String(Base64.getDecoder().decode(encoded), StandardCharsets.UTF_8);
複製程式碼