【java8新特性】蘭姆達表示式

我是太陽啦啦啦發表於2018-05-09

前言

java8新特性,速度快,程式碼少,便於並行,強大的streamAPI,最大化減少空指標異常,本篇部落格主要總結一下蘭姆達表示式.

核心

Why

Lambda是一個匿名函式,我們可以把Lambda表示式理解為一段可以傳遞的程式碼(將程式碼像資料一樣進行傳遞).可以寫出更簡潔/更靈活的程式碼.作為一種更緊湊的程式碼風格,使java的語言表達能力得到了提升.

What

Lambda表示式包含三部分:
1、左邊:指定了Lambda表示式需要的所有引數
2、一個箭頭符號:->
3、右邊指定了Lambda方法體,即Lambda表示式要執行的功能,可以是表示式和程式碼塊。

Grammer

語法格式一:無引數,無返回值

Runnable r1 = () -> System.out.println("Hello");

語法格式二:有一個引數,並且無返回值

Consumer<String> fun = x)->System.out.println(“Hello”);

語法格式三:若只有一個引數,()可以省略不寫

Consumer<String> fun = x->System.out.println(“Hello Lambda!”);

語法格式四:有兩個以上的引數,有返回值, 並且lambda體中有多條語句

BinaryOperator<Long> bo = (x,y) -> {System.out.println("實現函式介面的方法!";
return x + y;)}

語法格式五:若lambda體中只有一條語句,return和{}都可以省略不寫

BinaryOperator<Long> bo =(x,y) -> x + y;

語法格式六:lambda表示式的引數列表的資料型別可以省略不寫,因為JVM編譯器通過上下文推斷出,資料型別,即“型別推斷”

(x , y) -> Integer.compare(x, y);

函式式介面

我們要注意的是:lambda表示式需要“函式式介面”的支援,那麼什麼是函式式介面呢?
函式式介面:介面只有一個抽象方法的介面,成為函式式介面可以使用註解@FunctionalInterface
四大函式式介面

函式式介面 引數型別 返回型別 用途
Consumer < T>消費型介面 T void 對型別為T的物件應用操作,包含方法:void accept (T t)
Supplier < T>供給型介面 T 返回型別為T的物件,包含方法:T get();
Function < T,R>函式型介面 T R 對型別為T的物件應用操作,並返回結果.結果是R型別的物件.包含方法:R apply(T t)
Predicate < T>斷定型介面 T boolean 確定型別為T的物件是否滿足某約束,並返回Boolean值.包含方法boolean test(T t)

方法引入與構造器引用

方法引用

當要傳遞給Lambda體的操作,已經有實現的方法了,可以使用方法引用!
( 實現抽象方法的引數列表,必須與方法引用方法的引數列表保持一致! )
方法引用:使用操作符 “ ::” 將方法名和物件或類的名字分隔開來。
如下三種主要使用情況:
 物件::例項方法
 類::靜態方法
 類::例項方法
例如:
Compare((x,y) - > x.equals(y),”abc”,”abc”);
等同於:
Compare(String::equals,”abc”,”abc”);
注意: 當需要引用方法的第一個引數是呼叫物件,並且第二個引數是需要引
用方法的第二個引數(或無引數)時: ClassName::methodName

構造器引用

格式: ClassName::new
與函式式介面相結合,自動與函式式介面中方法相容。
可以把構造器引用賦值給定義的方法,與構造器引數
列表要與介面中抽象方法的引數列表一致!
例如:
Function

陣列引用

格式: type[] :: new
例如:
Function

總結

本篇部落格就總結到這裡了,下一篇我們們繼續總結StreamAPI,感謝讀者的閱讀.

相關文章