Java8函數(shù)式編程之三:函數(shù)式接口

上一篇博客Java8函數(shù)式編程之二 : Lambda表達式 - 簡書?介紹了Lambda表達式喝峦,最后也留下了一個問題互躬,就是Lambda到底用在什么地方,以及什么是函數(shù)式接口庐氮?

還記得我們在第一篇博客中定義的這個接口嗎?

public interfaceTradePredicate {

booleantest(Trade trade);

}

這就是一個函數(shù)式接口漆弄。那么怎樣去鑒別一個接口是否是函數(shù)式接口呢饱搏?

簡單的說:函數(shù)式接口就是只定義了一個抽象方法的接口。比如JavaAPI中的Comparator 和Runnable置逻。

public interface Comparator{

int compare(T o1, T o2);

}

public interface Runnable{

void run();

}

————————

注意:函數(shù)式接口是只定義“一個抽象方法”的接口推沸,只定義一個抽象方法并代表沒有其他方法,后面我們知道券坞,接口里還可以有默認方法鬓催。

————

我們也可以說,加上注解@FunctionalInterface的接口(只有一個抽象方法的接口)恨锚,就是一個函數(shù)式接口宇驾。

——————

關(guān)于函數(shù)式接口,注意以下幾點:

1.如果一個接口只有一個抽象方法猴伶,那么該接口就是函數(shù)式接口课舍。

2.如果我們在某個接口上聲明了@FunctionalInterface注解,那么編譯器就會按照函數(shù)式接口的定義來要求該接口他挎。

3.如果某個接口只有一個抽象方法筝尾,但我們并沒有給該接口聲明@FunctionalInterface注解,那么編譯器依舊會將其看作是函數(shù)式接口办桨。

————————————

@FunctionalInterface

public interfaceMyInterface {

public voidtest();

publicString myString();

}

這樣會報錯筹淫;

Invalid'@FunctionalInterface'annotation; MyInterface is not a functional interface

——————————

但是!

@FunctionalInterface

public interfaceMyInterface {

public voidtest();

publicString toString();

}

如果是這樣呢撞,就不會報錯损姜,為什么呢?

————————

我們看看Java Document文檔是怎么說的:

Ifan interface declares an abstract method overriding one of the

public methods of {@codejava.lang.Object}, that also does

notcount toward the interface's abstract method count

since any implementation of the interface will have an

implementation from {@codejava.lang.Object} or elsewhere.

簡單的解釋就是:當你重寫的方法是Object類的方法時殊霞,并不會算在“抽象方法”內(nèi)摧阅。

————————————

函數(shù)式接口的實例可以通過Lambda表達式,方法引用或者構(gòu)造方法引用來創(chuàng)建绷蹲。

————————————

我們來看看使用各種方式來遍歷集合棒卷,對比其特點:

public classTest {

public static voidmain(String[] args) {

List list = Arrays.asList(1,2,3,4,5,6,7,8,9);

//使用for循環(huán)

for(inti =0; i < list.size(); ++i) {

System.out.print(list.get(i));

}

//增強的for循環(huán)

for(Integer i : list) {

System.out.print(i);

}

//匿名內(nèi)部類

list.forEach(newConsumer() {

@Override

public voidaccept(Integer integer) {

System.out.print(integer);

}

});

//Lambda表達式

list.forEach(i -> {

System.out.print(i);

});

}

}

————————————————————

你可能對forEach()這個方法并不熟悉,我們可以看看它的Javadoc說明瘸右。

/**

* Performs the given action for each element of the {@codeIterable}

* until all elements have been processed or the action throws an

* exception.? Unless otherwise specified by the implementing class,

* actions are performed in the order of iteration (if an iteration order

* is specified).? Exceptions thrown by the action are relayed to the

* caller.

通過對forEach()方法注釋的理解娇跟,我們發(fā)現(xiàn)其執(zhí)行的的是一種給定的動作岩齿。

————————

那為何不繼續(xù)看看forEach()方法的實現(xiàn)呢太颤?

default voidforEach(Consumer action) {

Objects.requireNonNull(action);

for(Tt :this) {

action.accept(t);

}

}

————————

問題1:

你可能會疑惑,default是什么呢盹沈?好像以前沒有這個關(guān)鍵字龄章,并且這個方法是有實現(xiàn)的吃谣。這就是我們先前說的默認方法,Java8中做裙,接口里是可以有方法實現(xiàn)的岗憋,這種方法就是默認方法。這是個很好的設計锚贱,即有利于Java8的新的特性的加入仔戈,又很好的兼容了以前的Java版本。

——————————

問題2:forEach()里接收的參數(shù)類型是Consumer, 這個又是什么呢拧廊,有什么用呢监徘?

這個當然是函數(shù)式接口,不夠是Java8為我們提供的吧碾,還有類似的接口如Predicate,Function等等凰盔。在下一篇博客中將詳細介紹它們。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倦春,一起剝皮案震驚了整個濱河市户敬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睁本,老刑警劉巖尿庐,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呢堰,居然都是意外死亡屁倔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門暮胧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锐借,“玉大人,你說我怎么就攤上這事往衷〕瑁” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵席舍,是天一觀的道長布轿。 經(jīng)常有香客問我,道長来颤,這世上最難降的妖魔是什么汰扭? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮福铅,結(jié)果婚禮上萝毛,老公的妹妹穿的比我還像新娘。我一直安慰自己滑黔,他們只是感情好笆包,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布环揽。 她就那樣靜靜地躺著,像睡著了一般庵佣。 火紅的嫁衣襯著肌膚如雪歉胶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天巴粪,我揣著相機與錄音通今,去河邊找鬼。 笑死肛根,一個胖子當著我的面吹牛衡创,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晶通,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼璃氢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狮辽?” 一聲冷哼從身側(cè)響起一也,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喉脖,沒想到半個月后椰苟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡树叽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年舆蝴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片题诵。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡洁仗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出性锭,到底是詐尸還是另有隱情赠潦,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布草冈,位于F島的核電站她奥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怎棱。R本人自食惡果不足惜哩俭,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拳恋。 院中可真熱鬧凡资,春花似錦、人聲如沸诅岩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吩谦。三九已至鸳谜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間式廷,已是汗流浹背咐扭。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滑废,地道東北人蝗肪。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蠕趁,于是被迫代替她去往敵國和親薛闪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容