Ø 基本概念
理解FunctionalInterface(函數式接口,以下簡稱FI)是學習Java8 Lambda表達式的關鍵所在。FI的定義其實很簡單:任何接口,如果只包含唯一 一個抽象方法,那麼它就是一個FI。爲了讓編譯器幫助我們確保一個接口滿足FI的要求(也就是說有且僅有一個抽象方法),Java8提供了@FunctionalInterface註解。
對於方法的引用,嚴格來講都是需要定義一個接口,可是不管如何進行操作,實際上有可能裏面提供了一個包: java.util.function,主要提供以下四種核心接口:
1. 功能性接口(function): public interface Function<T,R>{public R apply(T t);}
------此接口接收一個參數,返回一個處理結果
2. 消費性接口(consumer): public interface Consumer<T>{public void accept(T t);}
------此接口只是接收數據,不返回處理結果
3. 供給性接口(Supplier):publicinterface Supplier<T>{public T get();}
------此接口不接受參數,但是返回處理結果
4. 斷言性接口(Predicate):publicinterface Predicate<T>{public boolean test(T t);}
------此接口用於進行判斷操作使用
Ø 實戰
具體的使用示例:
功能性接口
接口參數並且返回處理結果
/**
* 功能性接口
*/
Function<String,Boolean> fun="##hello"::startsWith; //表示方法中的參數
System.out.println(fun.apply("##"));
消費性接口
接口只是接口參數,並不返回處理結果
/**
* 消費性接口
*/
Consumer<String> cons=System.out :: println;
cons.accept("Hello World");
供給性接口
/**
* 供給型接口
*/
Supplier<String> sup="hello"::toUpperCase;
System.out.println(sup.get());
斷言性接口
/**
* 斷言性接口
*/
Predicate<String> pre="hello"::equalsIgnoreCase;
System.out.println(pre.test("Hello"));
上面的採用的是函數式接口進行實現的,如果你想把接受一些輸入參數並將對輸入參數處理過後的結果返回的功能封裝到一個方法內,Function接口是一個不錯的選擇。輸入的參數類型和輸出的結果類型可以一致或者不一致。具體結果可以試試輸出結果看看。
以上四種接口的實現採用的都是方法引用(Method References),也就是一個簡單的方法調用而已,也是lambda表達式的一種簡化寫法。理解了這些再來理解下面說的lambda表達式的話,可能會更加好理解性。