摘要:接下來看下如果使用提供的接口會(huì)有哪些改進(jìn)首先看下接口定義省略該函數(shù)式接口唯一的抽象方法接收一個(gè)參數(shù),有返回值。是不是有點(diǎn)體驗(yàn)到函數(shù)式編程的靈活之處。
上一篇文章中,我們總體介紹了創(chuàng)建函數(shù)式接口實(shí)例的幾種方式以及Java8中接口新增的默認(rèn)方法特性,接下來我們來看下Java8中已經(jīng)為我們提供的幾種典型的函數(shù)式接口
先看一個(gè)示例
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中定義了三個(gè)方法,分別把參數(shù)加2,加3,加4然后分別把結(jié)果返回,那如果以后還要取到參數(shù)的平方或者各種其他的運(yùn)算,就還需要定義更多的處理方法。接下來看下如果使用Java8提供的Function接口會(huì)有哪些改進(jìn)
首先看下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); . .省略 . }
該函數(shù)式接口唯一的抽象方法apply接收一個(gè)參數(shù),有返回值。看下使用方式
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); } //調(diào)用時(shí)傳入邏輯 public int compute(int i, Functionfunction){ Integer result = function.apply(i); return result; } }
我們在FunctionTest中定義了compute方法,方法的第一個(gè)參數(shù)是要運(yùn)算的數(shù)據(jù),第二個(gè)參數(shù)是函數(shù)式接口Function的實(shí)例,當(dāng)執(zhí)行compute方法時(shí),會(huì)將第一個(gè)參數(shù)交給第二個(gè)參數(shù)Function中的apply方法處理,然后返回結(jié)果。
這樣我們可以將方法定義的更抽象,代碼重用性也就越高,每次將要計(jì)算的數(shù)據(jù)和計(jì)算邏輯一起作為參數(shù)傳遞給compute方法就可以。是不是有點(diǎn)體驗(yàn)到函數(shù)式編程的靈活之處。
注:因?yàn)楸磉_(dá)式只有一行語句 num -> num + 2 可以省略了return 關(guān)鍵字 如果為了更加直觀可以寫成 num -> return num + 2
Supplier接口,默認(rèn)抽象方法get不接收參數(shù),有返回值
@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(); } }
這里使用構(gòu)造方法引用的方式創(chuàng)建Supplier實(shí)例,通過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); . .省略 . }
接收一個(gè)參數(shù),返回布爾類型,使用方式
public class PredicateTest { public static void main(String[] args) { Predicatepredicate = s -> s.length() > 5; System.out.println(predicate.test("hello")); } }
定義了一個(gè)接收一個(gè)參數(shù)返回布爾值的lambda表達(dá)式,賦值給predicate,就可以直接對傳入?yún)?shù)進(jìn)行校驗(yàn)
再看一個(gè)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的數(shù)據(jù),打印到控制臺(tái)。我們具體分析一下conditionFilter方法,第一個(gè)參數(shù)是待遍歷的集合,第二個(gè)參數(shù)是Predicate類型的實(shí)例,還記得Predicate接口中的抽象方法定義嗎,接收一個(gè)參數(shù)返回布爾類型。list.stream()是創(chuàng)建了一個(gè)針對此集合的Stream對象(先簡單認(rèn)識(shí)一下),然后調(diào)用Stream的filter方法對結(jié)果進(jìn)行過濾,過濾的條件就是Predicate接口的實(shí)現(xiàn),最后collect(Collectors.toList());是將過濾后的結(jié)果收集起來放置到一個(gè)新的集合中并返回。
其中涉及到Srteam api的知識(shí)點(diǎn)我們會(huì)在后續(xù)章節(jié)中詳細(xì)介紹,現(xiàn)在只關(guān)心Predicate的使用就可以。
接下來調(diào)用conditionFilter方法
Listresult = predicateTest.conditionFilter(list, integer -> integer > 5);
list是待遍歷的集合
integer -> integer > 5 lambda表達(dá)式是對Predicate接口的具體實(shí)現(xiàn)
result.forEach(System.out::println);
最后,方法引用實(shí)例化一個(gè)Consumer對象,把結(jié)果輸出到控制臺(tái)。
可以看出,lambda表達(dá)式和stream api結(jié)合起來使用讓代碼更簡潔更加語義化,即使之前沒接觸過stream api也能大概看出conditionFilter方法的功能。
小結(jié):本篇繼續(xù)介紹Java8函數(shù)式編程模型,介紹了幾個(gè)內(nèi)置的函數(shù)式接口使用方式,并在最后一個(gè)示例引出stream api知識(shí)點(diǎn),后續(xù)會(huì)對stream api進(jìn)行詳細(xì)的介紹,如果覺得本篇文章對你有所幫助幫忙贊一下。
下一篇
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70677.html
摘要:以我自己的理解,函數(shù)式編程就是以函數(shù)為中心,將大段過程拆成一個(gè)個(gè)函數(shù),組合嵌套使用。越來越多的跡象表明,函數(shù)式編程已經(jīng)不再是學(xué)術(shù)界的最愛,開始大踏步地在業(yè)界投入實(shí)用。也許繼面向?qū)ο缶幊讨螅瘮?shù)式編程會(huì)成為下一個(gè)編程的主流范式。 使用React也滿一年了,從剛剛會(huì)使用到逐漸探究其底層實(shí)現(xiàn),以便學(xué)習(xí)幾招奇技淫巧從而在自己的代碼中使用,寫出高效的代碼。下面整理一些知識(shí)點(diǎn),算是React看書...
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對方法,包括,,。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸耍虼宋闹兄豢炊?8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...
摘要:使用異步編程,有一個(gè)事件循環(huán)。它作為面向?qū)ο缶幊痰奶娲桨福渲袘?yīng)用狀態(tài)通常與對象中的方法搭配并共享。在用面向?qū)ο缶幊虝r(shí)遇到不同的組件競爭相同的資源的時(shí)候,更是如此。 翻譯:瘋狂的技術(shù)宅原文:https://www.indeed.com/hire/i... 本文首發(fā)微信公眾號(hào):jingchengyideng歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章 不管你是面試官還是求職者,里面...
摘要:本文最早為雙十一而作,原標(biāo)題雙大前端工程師讀書清單,以付費(fèi)的形式發(fā)布在上。發(fā)布完本次預(yù)告后,捕捉到了一個(gè)友善的吐槽讀書清單也要收費(fèi)。這本書便從的異步編程講起,幫助我們設(shè)計(jì)快速響應(yīng)的網(wǎng)絡(luò)應(yīng)用,而非簡單的頁面。 本文最早為雙十一而作,原標(biāo)題雙 11 大前端工程師讀書清單,以付費(fèi)的形式發(fā)布在 GitChat 上。發(fā)布之后在讀者圈群聊中和讀者進(jìn)行了深入的交流,現(xiàn)免費(fèi)分享到這里,不足之處歡迎指教...
閱讀 2561·2021-11-22 09:34
閱讀 3539·2021-11-15 11:37
閱讀 2341·2021-09-13 10:37
閱讀 2105·2021-09-04 16:40
閱讀 1564·2021-09-02 15:40
閱讀 2456·2019-08-30 13:14
閱讀 3326·2019-08-29 13:42
閱讀 1903·2019-08-29 13:02