摘要:接下來看下如果使用提供的接口會有哪些改進首先看下接口定義省略該函數式接口唯一的抽象方法接收一個參數,有返回值。是不是有點體驗到函數式編程的靈活之處。
上一篇文章中,我們總體介紹了創(chuàng)建函數式接口實例的幾種方式以及Java8中接口新增的默認方法特性,接下來我們來看下Java8中已經為我們提供的幾種典型的函數式接口
先看一個示例
public class FunctionTest { public static void main(String[] args) { FunctionTest functionTest = new FunctionTest(); int i2 = functionTest.add2(2); int i3 = functionTest.add3(2); int i4 = functionTest.add4(2); } //邏輯提前定義好 public int add2(int i){ return i + 2; } //邏輯提前定義好 public int add3(int i){ return i + 3; } //邏輯提前定義好 public int add4(int i){ return i + 4; } }
FunctionTest中定義了三個方法,分別把參數加2,加3,加4然后分別把結果返回,那如果以后還要取到參數的平方或者各種其他的運算,就還需要定義更多的處理方法。接下來看下如果使用Java8提供的Function接口會有哪些改進
首先看下Function接口定義
@FunctionalInterface public interface Function{ /** * Applies this function to the given argument. * * @param t the function argument * @return the function result */ R apply(T t); . .省略 . }
該函數式接口唯一的抽象方法apply接收一個參數,有返回值。看下使用方式
public class FunctionTest { public static void main(String[] args) { FunctionTest functionTest = new FunctionTest(); int result2 = functionTest.compute(5, num -> num + 2); int result3 = functionTest.compute(5, num -> num + 2); int result4 = functionTest.compute(5, num -> num + 2); int results = functionTest.compute(5, num -> num * num); } //調用時傳入邏輯 public int compute(int i, Functionfunction){ Integer result = function.apply(i); return result; } }
我們在FunctionTest中定義了compute方法,方法的第一個參數是要運算的數據,第二個參數是函數式接口Function的實例,當執(zhí)行compute方法時,會將第一個參數交給第二個參數Function中的apply方法處理,然后返回結果。
這樣我們可以將方法定義的更抽象,代碼重用性也就越高,每次將要計算的數據和計算邏輯一起作為參數傳遞給compute方法就可以。是不是有點體驗到函數式編程的靈活之處。
注:因為表達式只有一行語句 num -> num + 2 可以省略了return 關鍵字 如果為了更加直觀可以寫成 num -> return num + 2
Supplier接口,默認抽象方法get不接收參數,有返回值
@FunctionalInterface public interface Supplier{ /** * Gets a result. * * @return a result */ T get(); }
類似工廠模式
public class SupplierTest { public static void main(String[] args) { Suppliersupplier = String::new; String s = supplier.get(); } }
這里使用構造方法引用的方式創(chuàng)建Supplier實例,通過get直接返回String對象
Predicate接口
@FunctionalInterface public interface Predicate{ /** * Evaluates this predicate on the given argument. * * @param t the input argument * @return {@code true} if the input argument matches the predicate, * otherwise {@code false} */ boolean test(T t); . .省略 . }
接收一個參數,返回布爾類型,使用方式
public class PredicateTest { public static void main(String[] args) { Predicatepredicate = s -> s.length() > 5; System.out.println(predicate.test("hello")); } }
定義了一個接收一個參數返回布爾值的lambda表達式,賦值給predicate,就可以直接對傳入參數進行校驗
再看一個Predicate例子
public class PredicateTest { public static void main(String[] args) { Listlist = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); PredicateTest predicateTest = new PredicateTest(); List result = predicateTest.conditionFilter(list, integer -> integer > 5); result.forEach(System.out::println); } public List conditionFilter(List list, Predicate predicate){ return list.stream().filter(predicate).collect(Collectors.toList()); } }
這段程序的邏輯是找到集合里大于5的數據,打印到控制臺。我們具體分析一下conditionFilter方法,第一個參數是待遍歷的集合,第二個參數是Predicate類型的實例,還記得Predicate接口中的抽象方法定義嗎,接收一個參數返回布爾類型。list.stream()是創(chuàng)建了一個針對此集合的Stream對象(先簡單認識一下),然后調用Stream的filter方法對結果進行過濾,過濾的條件就是Predicate接口的實現,最后collect(Collectors.toList());是將過濾后的結果收集起來放置到一個新的集合中并返回。
其中涉及到Srteam api的知識點我們會在后續(xù)章節(jié)中詳細介紹,現在只關心Predicate的使用就可以。
接下來調用conditionFilter方法
Listresult = predicateTest.conditionFilter(list, integer -> integer > 5);
list是待遍歷的集合
integer -> integer > 5 lambda表達式是對Predicate接口的具體實現
result.forEach(System.out::println);
最后,方法引用實例化一個Consumer對象,把結果輸出到控制臺。
可以看出,lambda表達式和stream api結合起來使用讓代碼更簡潔更加語義化,即使之前沒接觸過stream api也能大概看出conditionFilter方法的功能。
小結:本篇繼續(xù)介紹Java8函數式編程模型,介紹了幾個內置的函數式接口使用方式,并在最后一個示例引出stream api知識點,后續(xù)會對stream api進行詳細的介紹,如果覺得本篇文章對你有所幫助幫忙贊一下。
下一篇
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/70677.html
摘要:以我自己的理解,函數式編程就是以函數為中心,將大段過程拆成一個個函數,組合嵌套使用。越來越多的跡象表明,函數式編程已經不再是學術界的最愛,開始大踏步地在業(yè)界投入實用。也許繼面向對象編程之后,函數式編程會成為下一個編程的主流范式。 使用React也滿一年了,從剛剛會使用到逐漸探究其底層實現,以便學習幾招奇技淫巧從而在自己的代碼中使用,寫出高效的代碼。下面整理一些知識點,算是React看書...
摘要:設計模式是以面向對象編程為基礎的,的面向對象編程和傳統(tǒng)的的面向對象編程有些差別,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設計模式必須要先搞懂面向對象編程,否則只會讓你自己更痛苦。 JavaScript 中的構造函數 學習總結。知識只有分享才有存在的意義。 是時候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數組的那些迭代方法~ ...
摘要:理解的函數基礎要搞好深入淺出原型使用原型模型,雖然這經常被當作缺點提及,但是只要善于運用,其實基于原型的繼承模型比傳統(tǒng)的類繼承還要強大。中文指南基本操作指南二繼續(xù)熟悉的幾對方法,包括,,。商業(yè)轉載請聯系作者獲得授權,非商業(yè)轉載請注明出處。 怎樣使用 this 因為本人屬于偽前端,因此文中只看懂了 8 成左右,希望能夠給大家?guī)韼椭?...(據說是阿里的前端妹子寫的) this 的值到底...
摘要:使用異步編程,有一個事件循環(huán)。它作為面向對象編程的替代方案,其中應用狀態(tài)通常與對象中的方法搭配并共享。在用面向對象編程時遇到不同的組件競爭相同的資源的時候,更是如此。 翻譯:瘋狂的技術宅原文:https://www.indeed.com/hire/i... 本文首發(fā)微信公眾號:jingchengyideng歡迎關注,每天都給你推送新鮮的前端技術文章 不管你是面試官還是求職者,里面...
摘要:本文最早為雙十一而作,原標題雙大前端工程師讀書清單,以付費的形式發(fā)布在上。發(fā)布完本次預告后,捕捉到了一個友善的吐槽讀書清單也要收費。這本書便從的異步編程講起,幫助我們設計快速響應的網絡應用,而非簡單的頁面。 本文最早為雙十一而作,原標題雙 11 大前端工程師讀書清單,以付費的形式發(fā)布在 GitChat 上。發(fā)布之后在讀者圈群聊中和讀者進行了深入的交流,現免費分享到這里,不足之處歡迎指教...
閱讀 2627·2021-11-22 09:34
閱讀 3603·2021-11-15 11:37
閱讀 2426·2021-09-13 10:37
閱讀 2182·2021-09-04 16:40
閱讀 1789·2021-09-02 15:40
閱讀 2518·2019-08-30 13:14
閱讀 3393·2019-08-29 13:42
閱讀 2007·2019-08-29 13:02