Java8特性:函數式接口之常用接口篇

Java自誕生已經有十幾個年頭了,目前也已經發布了第十三個大版本,其中Java8是常用的版本中最新的一個版本。而Java8最大的特性就是:Lambda表達式、函數式接口和Stream流。

本篇我只介紹常見的函數式接口,別的不會提及。對於什麼是函數式接口,大家可以自己在網上查找或參考我的另一篇文章 ,這裡就不過多提及。另外,我需要說明的是,為了演示常見函數式接口的效果,我會使用Lambda表達式。如果有不懂的無須過多糾結,只看實現效果即可。廢話不多說,下面進入正題。

對於常用的函數式接口分兩種:Java8之前已存在的和Java8新增的。

對於Java8之前就已經存在的函數式接口,目前我就想起來三個,分別是:Runnable、Callable和Comparator接口。其中Runnable和Callable是用做線程任務執行體,而Comparator常用作對象比較器。

Java8之後,又新增許多的函數式接口,它們大都分佈在Java.util.Function包下,常用接口如下圖:

Java8特性:函數式接口之常用接口篇

當然,這些常用接口看著挺多的,但是大體上有相似之處。所以我只講有限幾個,剩下的大家進行類比即可。

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);

這裡我只貼出了抽象方法,對於每個接口而言,或多或少得都存在幾個默認方法。但是那已經不屬於我們關注的範疇。其中,下面我寫一個小例子來簡單給大家看看這些接口的作用。

Java8特性:函數式接口之常用接口篇

執行結果如下圖:

Java8特性:函數式接口之常用接口篇

XXXSupplier

這一類的接口都是生產者,也就是說這些函數式接口的抽象方法作用是:返回一個對象供別的地方使用,其唯一的抽象方法聲明分別如下

Supplier:

T get();

DoubleSupplier:

double getAsDouble();

LongSupplier:

long getAsLong();

IntSupplier:

int getAsInt();

同樣的,這些生產者接口也或多或少的存在著默認方法或靜態方法,接下來我提供一個小例子來測試一下這幾個生產者函數式接口。

Java8特性:函數式接口之常用接口篇

執行結果如下圖:

Java8特性:函數式接口之常用接口篇

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);

同樣的,這些轉換者接口也或多或少的存在著默認方法或靜態方法,接下來我提供一個小例子來測試一下這幾個轉換者的函數式接口。

Java8特性:函數式接口之常用接口篇

執行結果如下圖:

Java8特性:函數式接口之常用接口篇

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特性:函數式接口之常用接口篇

執行結果後如下:

Java8特性:函數式接口之常用接口篇

到此,常用的函數式接口便已介紹完畢。當然,函數式接口最大的作用還是在配合Java8的新特性:Stream流。至於Stream流是啥,就敬請期待我的下一篇文章吧。


分享到:


相關文章: