java8特性之lambda表達式
lambda表達式含義
函數(shù)式接口
1.什么是函數(shù)式接口
2.自定義函數(shù)
3.作為參數(shù)傳遞Lambda表達式
4.四大內置核心函數(shù)式接口
方法引用與構造器引用
方法引用
構造器引用(了解)
數(shù)組引用(了解)
lambda表達式含義
lambda表達式是對某些接口的簡單實現(xiàn),Lambda 規(guī)定接口中只能有一個需要被實現(xiàn)的方法,不是規(guī)定接口中只能有一個方法,這就是函數(shù)式接口。** lambda表達式引入“->” 左側代表參數(shù)列表,右側代表需要的功能,邏輯
函數(shù)式接口

1.什么是函數(shù)式接口
(1)、只包含一個抽象方法的接口,稱為函數(shù)式接口。(2)、你可以通過Lambda表達式來創(chuàng)建該接口的對象。(若Lambda表達式拋出一個受檢異常,那么該異常需要在目標接口的抽象方法上進行聲明)。(3)、我們可以在任意函數(shù)式接口上使用@FunctionalInterface注解,這樣做可以檢查它是否是一個函數(shù)式接口,同時javadoc也會包含一條聲明,說明這個接口是一個函數(shù)式接口。
2.自定義函數(shù)
示例代碼一:
示例代碼二:函數(shù)式接口中使用泛型
3.作為參數(shù)傳遞Lambda表達式
示例代碼:
作為參數(shù)傳遞Lambda表達式:為了將Lambda表達式作為參數(shù)傳遞,接收Lambda表達式的參數(shù)類型必須是與該Lambda表達式兼容的函數(shù)式接口的類型。**
4.四大內置核心函數(shù)式接口

一、Consumer:消費型接口(void accept(T t))
consumer 接口翻譯過來就是消費者,顧名思義,該接口對應的方法類型為接收一個參數(shù),沒有返回值,可以通俗的理解成將這個參數(shù)'消費掉了',一般來說使用Consumer接口往往伴隨著一些期望狀態(tài)的改變或者事件的發(fā)生,例如最典型的forEach就是使用的Consumer接口,雖然沒有任何的返回值,但是卻向控制臺輸出了語句。Consumer 使用accept對參數(shù)執(zhí)行行為
以上為消費型接口,有參數(shù),無返回值類型的接口。
二、Supplier:供給型接口(T get())
Supplier 接口翻譯過來就是提供者,和上面的消費者相反,該接口對應的方法類型為不接受參數(shù),但是提供一個返回值,通俗的理解為這種接口是無私的奉獻者,不僅不要參數(shù),還返回一個值,使用get()方法獲得這個返回值
上面就是一個供給類型的接口,只有產出,沒人輸入,就是只有返回值,沒有入?yún)?/p>
三、Function<T, R>:函數(shù)型接口(R apply(T t))
function,顧名思義,函數(shù)的意思,這里的函數(shù)是指數(shù)學上的函數(shù)哦,你也可以說是嚴格函數(shù)語言中的函數(shù),例如haskell里的,他接受一個參數(shù),返回一個值,永遠都是這樣,是一個恒定的,狀態(tài)不可改變的方法。其實想講函數(shù)這個將徹底明白可以再開一篇博客了,所以這里不詳細的說了。?? 上面說到,函數(shù)接口是對行為的抽象,因此我方便大家理解,就用java中的方法作例子。
上面就是一個函數(shù)型接口,輸入一個類型得參數(shù),輸出一個類型得參數(shù),當然兩種類型可以一致。
四、Predicate:斷言型接口(boolean test(T t))
predicate<T,Boolean> 謂語接口,顧名思義,中文中的‘是’與‘不是’是中文語法的謂語,同樣的該接口對應的方法為接收一個參數(shù),返回一個Boolean類型值,多用于判斷與過濾,當然你可以把他理解成特殊的Funcation<T,R>,但是為了便于區(qū)分語義,還是單獨的劃了一個接口,使用test()方法執(zhí)行這段行為
上面就是一個斷言型接口,輸入一個參數(shù),輸出一個boolean類型的返回值。
總結
四大函數(shù)接口和他們引申出的各類接口,重點是對不同種類行為的封裝導致了設計出不同的函數(shù)接口,另外在使用函數(shù)接口或者lambda表達式的時候,要注意lambda對值封閉這個特性。
方法引用與構造器引用
方法引用
當要傳遞給Lambda體的操作,已經有實現(xiàn)的方法,就可以使用方法引用!實現(xiàn)抽象方法的參數(shù)列表,必須與方法引用方法的參數(shù)列表保持一致 方法引用使用操作符“::”將方法名和對象或者類的名字分隔開來。三種使用情況:對象::實例方法類::靜態(tài)方法類::實例方法
例如
BinaryOperator bo=(x,y)->Math.pow(x,y)
等同于:
BinaryOperator<Double> bo=Math::pow;
構造器引用(了解)
格式:ClassName::new與函數(shù)式接口相結合,自動與函數(shù)式接口中方法兼容??梢园褬嬙炱饕觅x值給定義的方法,與構造器參數(shù)列表要與接口中抽象方法的參數(shù)列表一直 例如:
Function<Integer,MyClass> fun=(n)->new MyClass(n);
等同于:
Function<Integer,MyClass> fun=MyClass::new;
數(shù)組引用(了解)
格式:type[]::new例如:
Function<Integer,Integer[]> fun=(n)->new Integer[n];
等同于:
Function<Integer,Integer[]> fun=Integer[]::new;
歡迎關注公眾號【ggball blog】!
- END -
本文使用?文章同步助手?同步