今天就跟大家聊聊有關(guān)Java8中怎么實(shí)現(xiàn)函數(shù)入?yún)?,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的鄧州網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
Java8支持將函數(shù)作為參數(shù)傳遞到另一個函數(shù)內(nèi)部,在第一篇學(xué)習(xí)筆記中也簡單提到了這個用法。但是在第一篇學(xué)習(xí)的時候,還是困惑的,先說下我的困惑。
在第一篇中提到函數(shù)入?yún)ⅲ雲(yún)⒌念愋鸵榷x一個接口:
public interface Predicate{ boolean test(T t); }
然后定義一個函數(shù)如下:
public static ListfilterApples(List inventory,Predicate predicate){ List result = new ArrayList<>(); for(Apple apple:inventory){ if(predicate.test(apple)){ result.add(apple); } } return result; }
最后調(diào)用該方法:
ListfilterGreenApples= filterApples(originApples,Apple::isGreenApple);
這里問題就來了,入?yún)㈩愋褪且粋€接口Predicate,那實(shí)際入?yún)⒉粦?yīng)該是這個接口的實(shí)現(xiàn)類的對象嗎,為什么直接就傳了這個靜態(tài)方法呢?
帶著這個問題,開始再繼續(xù)學(xué)習(xí)一下函數(shù)入?yún)⑦@塊內(nèi)容。
要理清函數(shù)作為參數(shù)傳遞這塊內(nèi)容,還得先從最簡單的實(shí)現(xiàn)看起。在學(xué)習(xí)設(shè)計模式的時候,有了解過策略模式。第一個文章蘋果那個demo為例,加上策略模式。
首先定義一個接口,后面實(shí)現(xiàn)的所有策略都基于該接口:
public interface ApplePredicate{ boolean test(T t); }
接著實(shí)現(xiàn)兩個篩選蘋果的策略:一個是根據(jù)顏色進(jìn)行篩選,另一個是根據(jù)重量進(jìn)行篩選:
public class filterAppleByColorPredicate implements Predicate{ @Override public boolean test(Apple apple) { return "green".equals(apple.getColor()); } } public class filterAppleByWeightPredicate implements Predicate { @Override public boolean test(Apple apple) { return apple.getWeight() > 15; } }
最后main方法實(shí)現(xiàn)如下:
public static void main(String[] args){ Listinventory = ...; // 選擇根據(jù)顏色過濾的策略過濾 ApplePredicate colorPredicate = new filterAppleByColorPredicate(); filterApples(inventory,colorPredicate); // 選擇根據(jù)重量過濾的策略過濾 ApplePredicate weightPredicate = new filterAppleByWeightPredicate(); filterApples(inventory,weightPredicate); } public static List filterApples(List inventory,ApplePredicate predicate){ List result = new ArrayList<>(); for(Apple apple:inventory){ if(predicate.test(apple)){ result.add(apple); } } return result; }
這樣就實(shí)現(xiàn)了一個基于策略模式的代碼。
在第二小節(jié)的基礎(chǔ)上,直接使用匿名類,省去了各種策略的實(shí)現(xiàn)類的定義:
filterApples(inventory,new ApplePredicate() { public boolean test(Apple apple){ return "green".equals(apple.getColor()); } });
第三小節(jié)使用匿名類,但是當(dāng)代碼量多了以后,還是顯得累贅,為此引入Lambda表達(dá)式來簡化編寫:
filterApples(inventory,(Apple apple) -> "green".equals(apple.getColor()));
關(guān)于Lambda這里我還是有疑問的,假如接口定義了兩個方法:
public interface ApplePredicate{ boolean test(T t); boolean test2(T t); }
看完上述內(nèi)容,你們對Java8中怎么實(shí)現(xiàn)函數(shù)入?yún)⒂羞M(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。