這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)怎么在Java8項目中實現(xiàn)一個函數(shù)式編程,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名注冊、虛擬主機、營銷軟件、網(wǎng)站建設(shè)、南昌縣網(wǎng)站維護、網(wǎng)站推廣。函數(shù)式的思考
命令式編程
一般我們實現(xiàn)一個系統(tǒng)有兩種思考方式,一種專注于如何實現(xiàn),比如下廚做菜,通常按照自己熟悉的烹飪方法:首先洗菜, 然后切菜,熱油,下菜,然后…… 這看起來像是一系列的命令合集。對于這種”如何做”式的編程風格我們稱之為命令式編程, 它的特點非常像工廠的流水線、計算機的指令處理,都是串行化、命令式的。
CookingTask cookingTask = new CookingTask(); cookingTask.wash(); cookingTask.cut(); cookingTask.deepFry(); cookingTask.fried(); ...
聲明式編程
還有一種方式你關(guān)注的是要做什么,我們?nèi)绻胠ambda和函數(shù)式來解決上述問題應(yīng)該是這樣的:
public class CookingDemo { public void doTask(String material, Consumer<String> consumer) { consumer.accept(material); } public static void main(String[] args) { CookingDemo cookingDemo = new CookingDemo(); cookingDemo.doTask("蔬菜", material -> System.out.println("清洗" + material)); cookingDemo.doTask("蔬菜", material -> System.out.println(material + "切片")); cookingDemo.doTask("食用油", material -> System.out.println(material + "燒熱")); cookingDemo.doTask("", material -> System.out.println("炒菜")); } }
這里我們將烹飪的實現(xiàn)細節(jié)交給了函數(shù)庫,它大的優(yōu)勢在于你讀起來就像是在問題陳述,采用這種方式我們很快可以理解它的功能, 當你在烹飪流程中添加其他步驟也變得非常簡單,你只需要調(diào)用doTask方法將材料傳遞進去處理,比如在食用油燒熱前我要打個雞蛋
cookingDemo.doTask("雞蛋", material -> System.out.println(material + "打碎攪拌均勻"));
而不用再編寫一個處理雞蛋的方法。
什么是函數(shù)式編程
對于“什么是函數(shù)式編程”這一問題最簡化的回答是“它是一種使用函數(shù)進行編程的方式”。 每個人的理解都是不同的,其核心是:在思考問題時,使用不可變值和函數(shù),函數(shù)對一個值進行處理,映射成另一個值。
不同的語言社區(qū)往往對各自語言中的特性孤芳自賞?,F(xiàn)在談Java程序員如何定義函數(shù)式編程還為時尚早, 但是,這根本不重要!我們關(guān)心的是如何寫出好代碼,而不是符合函數(shù)式編程風格的代碼。
我們想象一下設(shè)計一個函數(shù),輸入一個字符串類型和布爾類型參數(shù),輸出一個整形參數(shù)。
int pos = 0; public Integer foo(String str, boolea flag){ if(flag && null != str){ pos++; } return pos; }
這個例子有輸入也有輸出,同時每次調(diào)用也可能會更行外部的變量值,這樣的函數(shù)我們稱之為是有副作用的函數(shù)。
在函數(shù)式編程的上下文中,一個“函數(shù)”對應(yīng)于一個數(shù)學(xué)函數(shù):它接受零個或多個參數(shù),生成一個或多個結(jié)果,并且不會有任何副作用。 你可以把它看成一個黑盒,它接收輸入并產(chǎn)生一些輸出,像下面的函數(shù)
public Integer foo(String str, boolea flag){ if(flag && null != str){ return 1; } return 0; }
這種類型的函數(shù)和你在Java編程語言中見到的函數(shù)之間的區(qū)別是非常重要的(我們無法想象,log或者sin這樣的數(shù)學(xué)函數(shù)會有副作用)。 尤其是,使用同樣的參數(shù)調(diào)用數(shù)學(xué)函數(shù),它所返回的結(jié)果一定是相同的。這里,我們暫時不考慮Random.nextInt這樣的方法,
函數(shù)的副作用
當談?wù)摗昂瘮?shù)式”時,我們想說的其實是“像數(shù)學(xué)函數(shù)那樣——沒有副作用”。由此,編程上的一些精妙問題隨之而來。 我們的意思是,每個函數(shù)都只能使用函數(shù)和像if-then-else這樣的數(shù)學(xué)思想來構(gòu)建嗎? 或者,我們也允許函數(shù)內(nèi)部執(zhí)行一些非函數(shù)式的操作,只要這些操作的結(jié)果不會暴露給系統(tǒng)中的其他部分? 換句話說,如果程序有一定的副作用,不過該副作用不會為其他的調(diào)用者感知,是否我們能假設(shè)這種副作用不存在呢? 調(diào)用者不需要知道,或者完全不在意這些副作用,因為這對它完全沒有影響。
當我們希望能界定這二者之間的區(qū)別時,我們將第一種稱為純粹的函數(shù)式編程,后者稱為函數(shù)式編程。
在編程實戰(zhàn)中我們很難用Java語言以純粹的函數(shù)式來完成一個程序的,因為很多老的代碼包括標準庫的函數(shù)都是有副作用的 (調(diào)用Scanner.nextLine就有副作用,它會從一個文件中讀取一行, 通常情況兩次調(diào)用的結(jié)果完全不同)。你希望為你的系統(tǒng) 編寫接近純函數(shù)式的實現(xiàn),需要確保你的代碼沒有副作用。假設(shè)這樣一個函數(shù)或者方法,它沒有副作用,進入方法體執(zhí)行時會對一個字段的值加一, 退出方法體之前會對該字段減一。對一個單線程的程序而言,這個方法是沒有副作用的,可以看作函數(shù)式的實現(xiàn)。
我們構(gòu)建函數(shù)式的準則是,被稱為“函數(shù)式”的函數(shù)或方法都只能修改局部變量,除此之外,它引用的對象都應(yīng)該是final的。 所有的引用類型字段都指向不可變對象。
上述就是小編為大家分享的怎么在Java8項目中實現(xiàn)一個函數(shù)式編程了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞標題:怎么在Java8項目中實現(xiàn)一個函數(shù)式編程-創(chuàng)新互聯(lián)
本文URL:http://www.rwnh.cn/article28/csidjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站營銷、網(wǎng)站改版、云服務(wù)器、移動網(wǎng)站建設(shè)、手機網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容