Java8常用的新特性總結

讀書遛狗遠方發表於2019-05-13

一、Java8常用的新特性總結

1.1.Java8常用特性總覽

image-20190513214122701

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體的操作,已經有了實現的方法,可以使用方法引用. (實現抽象方法的引數列表,必須與方法引用方法的引數列表保持一致)。 方法引用:使用操作符“::”將方法名和物件或類的名字分割開,例如:

  1. 物件::例項方法
  2. 類::靜態方法
  3. 類::例項方法

方法引用的實質就是使用更簡單的方式代替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);
複製程式碼

1.9.更多更詳細資訊

相關文章