您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Java8中怎么實現函數入參,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
Java8支持將函數作為參數傳遞到另一個函數內部,在第一篇學習筆記中也簡單提到了這個用法。但是在第一篇學習的時候,還是困惑的,先說下我的困惑。
在第一篇中提到函數入參,入參的類型要先定義一個接口:
public interface Predicate<T> { boolean test(T t); }
然后定義一個函數如下:
public static List<Apple> filterApples(List<Apple> inventory,Predicate<Apple> predicate){ List<Apple> result = new ArrayList<>(); for(Apple apple:inventory){ if(predicate.test(apple)){ result.add(apple); } } return result; }
最后調用該方法:
List<Apple> filterGreenApples= filterApples(originApples,Apple::isGreenApple);
這里問題就來了,入參類型是一個接口Predicate,那實際入參不應該是這個接口的實現類的對象嗎,為什么直接就傳了這個靜態方法呢?
帶著這個問題,開始再繼續學習一下函數入參這塊內容。
要理清函數作為參數傳遞這塊內容,還得先從最簡單的實現看起。在學習設計模式的時候,有了解過策略模式。第一個文章蘋果那個demo為例,加上策略模式。
首先定義一個接口,后面實現的所有策略都基于該接口:
public interface ApplePredicate<T> { boolean test(T t); }
接著實現兩個篩選蘋果的策略:一個是根據顏色進行篩選,另一個是根據重量進行篩選:
public class filterAppleByColorPredicate implements Predicate<Apple> { @Override public boolean test(Apple apple) { return "green".equals(apple.getColor()); } } public class filterAppleByWeightPredicate implements Predicate<Apple> { @Override public boolean test(Apple apple) { return apple.getWeight() > 15; } }
最后main方法實現如下:
public static void main(String[] args){ List<Apple> inventory = ...; // 選擇根據顏色過濾的策略過濾 ApplePredicate colorPredicate = new filterAppleByColorPredicate(); filterApples(inventory,colorPredicate); // 選擇根據重量過濾的策略過濾 ApplePredicate weightPredicate = new filterAppleByWeightPredicate(); filterApples(inventory,weightPredicate); } public static List<Apple> filterApples(List<Apple> inventory,ApplePredicate<Apple> predicate){ List<Apple> result = new ArrayList<>(); for(Apple apple:inventory){ if(predicate.test(apple)){ result.add(apple); } } return result; }
這樣就實現了一個基于策略模式的代碼。
在第二小節的基礎上,直接使用匿名類,省去了各種策略的實現類的定義:
filterApples(inventory,new ApplePredicate<Apple>() { public boolean test(Apple apple){ return "green".equals(apple.getColor()); } });
第三小節使用匿名類,但是當代碼量多了以后,還是顯得累贅,為此引入Lambda表達式來簡化編寫:
filterApples(inventory,(Apple apple) -> "green".equals(apple.getColor()));
關于Lambda這里我還是有疑問的,假如接口定義了兩個方法:
public interface ApplePredicate<T> { boolean test(T t); boolean test2(T t); }
看完上述內容,你們對Java8中怎么實現函數入參有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。