Java 8 函數式介面掃雷指南
java 8 Functionaml Interfaces
在前文中我們複習了Lambdas表達式和一些基本的函數式介面。在本文中將重點討論一下函數式介面,重點討論以一下兩點:
什麼是函數式介面?
函數式介面使用時方方面面
什麼是函數式介面?
函數式介面(Functional Interface)是Java 8對一類特殊類型的介面的稱呼。這類介面有且只有一個抽象方法的介面(除了隱含的Object對象的公共方法),因此最開始也就做SAM類型的介面(Single Abstract Method)。
為什麼會單單從介面中定義出此類介面呢?原因是在Java Lambda的實現中,開發組不想再為Lambda表達式單獨定義一種特殊的Structural函數類型,稱之為箭頭類型(arrow type),依然想採用Java既有的類型系統(class, interface, method等),原因是增加一個結構化的函數類型會增加函數類型的複雜性,破壞既有的Java類型,並對成千上萬的Java類庫造成嚴重的影響。權衡利弊,因此最終還是利用SAM介面作為Lambda表達式的目標類型。
函數式介面代表的一種契約,一種對某個特定函數類型的契約。在它出現的地方,實際期望一個符合契約要求的函數。Lambda表達式不能脫離上下文而存在,它必須要有一個明確的目標類型,而這個目標類型就是某個函數式介面。
Java 8 新增了一個註解@FunctionalInterface表示SAM介面。如果一個介面符合"函數式介面"定義,那麼加不加該註解都沒有影響。加上該註解能夠更好地讓編譯器進行檢查。如果編寫的不是函數式介面,但是加上了@FunctionInterface,那麼編譯器會報錯。另外函數式編程中記著要純哦!加個這個註解先把函數式的標籤給貼上吧。
只說不練的教程都是耍流氓!
先定義一個FunctionInterface:
Function interface
函數式介面使用時方方面面
東: 有且只有一個抽象方法
SAM介面不一定是FunctionalInterface,但FunctionalInterface一定是SAM介面。
南: @FunctionalInterface 註解可省略
東南解釋:加上註解,如果出現兩個以上抽象方法時,就會報錯~
西: default 方法是完全支持的
北: 對java.lang.Object方法的@Override不算是抽象方法
Happy Work!
※Google Guava 筆記(一)-Collections
※Google Guava 筆記(二)-深入探索
※JavaScript中this常見的兩個坑
※JavaScript 代碼規範,自帶 linter & 代碼自動修正
※JavaScript 之Array 你真的了解嗎?
TAG:教授學苑 |
※2018年4月輕改動畫掃雷前瞻——《刀劍神域外傳 Gun Gale Online》
※破解Windows掃雷遊戲
※Roguelike掃雷《穿越雷區》、在線FPS《危機臨近》
※P2P掃雷指南請收好
※自動掃雷 python
※《Overlord》第三季掃雷,破軍的魔王與魔導國
※篝火掃雷團:新、奇、特的 Roguelike 卡牌遊戲《指環之城》
※iPhoneX上跑WIN95什麼感覺 玩掃雷和紅警一點都不卡
※篝火掃雷團:王道挖礦搜寶 Roguelike《礦坑之下》前瞻
※KSrelief發起全面掃雷計劃,為葉門人民創造「無地雷生活環境」
※起售價7.6萬元的蘋果Mac Pro玩掃雷卡不卡?
※篝火掃雷團:走進北歐探尋黑暗的秘密《屍靈(Draugen)》前瞻
※「蟹」爾曼了解一下!1/72 M4A4 CRAB蟹式掃雷坦克–模型作品
※iPad加掃雷就像玩AR遊戲
※重溫《空當接龍》、《掃雷》!國外大神把 Windows 95 做成了 App,帶你回到童年
※雷場剋星-日本92式掃雷車
※俄羅斯 烏蘭-6 掃雷機器人簡介(上)
※俄羅斯 烏蘭-6 掃雷機器人簡介(中)
※俄羅斯 烏蘭-6 掃雷機器人簡介(下)
※瑞典CV90戰車掃雷版