Java自誕生已經有十幾個年頭了,目前也已經發布了第十三個大版本,其中Java8是常用的版本中最新的一個版本。而Java8最大的特性就是:Lambda表達式、函數式接口和Stream流。
本篇我只介紹常見的函數式接口,別的不會提及。對於什麼是函數式接口,大家可以自己在網上查找或參考我的另一篇文章 ,這裡就不過多提及。另外,我需要說明的是,為了演示常見函數式接口的效果,我會使用Lambda表達式。如果有不懂的無須過多糾結,只看實現效果即可。廢話不多說,下面進入正題。
對於常用的函數式接口分兩種:Java8之前已存在的和Java8新增的。
對於Java8之前就已經存在的函數式接口,目前我就想起來三個,分別是:Runnable、Callable和Comparator接口。其中Runnable和Callable是用做線程任務執行體,而Comparator常用作對象比較器。
Java8之後,又新增許多的函數式接口,它們大都分佈在Java.util.Function包下,常用接口如下圖:
當然,這些常用接口看著挺多的,但是大體上有相似之處。所以我只講有限幾個,剩下的大家進行類比即可。
XXXConsumer:
這一類的函數式接口都是消費者,也就是說這些函數式接口的抽象方法作用是:接收參數並進行處理,其唯一的抽象方法聲明分別如下:
Consumer:
void accept(T t);
DoubleConsumer:
void accept(double value);
IntConsumer:
void accept(int value);
LongConsumer:
void accept(long value);
ObjDoubleConsumer:
void accept(T t, double value);
ObjLongConsumer:
void accept(T t, long value);
ObjIntConsumer:
void accept(T t, int value);
BiConsumer:
void accept(T t, U u);
這裡我只貼出了抽象方法,對於每個接口而言,或多或少得都存在幾個默認方法。但是那已經不屬於我們關注的範疇。其中,下面我寫一個小例子來簡單給大家看看這些接口的作用。
執行結果如下圖:
XXXSupplier
這一類的接口都是生產者,也就是說這些函數式接口的抽象方法作用是:返回一個對象供別的地方使用,其唯一的抽象方法聲明分別如下
Supplier:
T get();
DoubleSupplier:
double getAsDouble();
LongSupplier:
long getAsLong();
IntSupplier:
int getAsInt();
同樣的,這些生產者接口也或多或少的存在著默認方法或靜態方法,接下來我提供一個小例子來測試一下這幾個生產者函數式接口。
執行結果如下圖:
XXXFunction
這一類的接口,我認為都是用來進行轉換的。也就是說這些函數式接口的抽象方法作用是:將傳入的參數變換成另一種數據。其唯一的抽象方法分別如下:
Function:
R apply(T t);
IntFunction:
R apply(int value);
DoubleFunction:
R apply(double value);
LongFunction:
R apply(long value);
DoubleToIntFunction:
long applyAsLong(double value);
DoubleToLongFunction:
long applyAsLong(double value);
IntToLongFunction:
long applyAsLong(int value);
IntToDoubleFunction:
double applyAsDouble(int value);
LongToIntFunction:
int applyAsInt(long value);
LongToDoubleFunction:
double applyAsDouble(long value);
BiFunction:
R apply(T t, U u);
ToDoubleFunction:
double applyAsDouble(T value);
ToDoubleBiFunction:
double applyAsDouble(T t, U u);
ToLongFunction:
long applyAsLong(T value);
ToLongBiFunction:
long applyAsLong(T t, U u);
ToIntFunction:
int applyAsInt(T value);
ToIntBiFunction:
int applyAsInt(T t, U u);
同樣的,這些轉換者接口也或多或少的存在著默認方法或靜態方法,接下來我提供一個小例子來測試一下這幾個轉換者的函數式接口。
執行結果如下圖:
XXXPredicate
這一類的接口,我認為都是用來進條件判斷行。也就是說這些函數式接口的抽象方法作用是:根據傳入的參數來進行判斷後返回一個布爾值。其唯一的抽象方法分別如下:
Predicate:
boolean test(T t);
BiPredicate:
boolean test(T t, U u);
DoublePredicate:
boolean test(double value);
IntPredicate:
boolean test(int value);
LongPredicate:
boolean test(long value);
同樣的,這些轉換者接口也或多或少的存在著默認方法或靜態方法,接下來我提供一個小例子來測試一下條件判斷的這函數式接口。
執行結果後如下:
到此,常用的函數式接口便已介紹完畢。當然,函數式接口最大的作用還是在配合Java8的新特性:Stream流。至於Stream流是啥,就敬請期待我的下一篇文章吧。
閱讀更多 但求無Bug 的文章