下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 論函數(shù)式編程在java程序中的應(yīng)用 連潔摘要:函數(shù)式編程已經(jīng)成為當(dāng)前最流行的編程模式之一,根據(jù)java8最新標(biāo)準(zhǔn),介紹了lambda表達(dá)式對(duì)函數(shù)式編程的支持,并探討了stream類在應(yīng)用開發(fā)中的使用方式,對(duì)lambda表達(dá)式的應(yīng)用模式進(jìn)行了探討。關(guān)鍵詞:函數(shù)式;java程序;應(yīng)用:tp311 :a :1009-3044(2015)06-0099-02函數(shù)式編程(functional programming)作為當(dāng)前最流行的編程規(guī)范之一,主流語言都對(duì)其進(jìn)行了支持,作為編程領(lǐng)域最重要的java語言,也在最新的jdk8中新增了相關(guān)特性,這就是la
2、mbda()表達(dá)式及stream類。它使得java語言進(jìn)一步與當(dāng)今流行趨勢結(jié)合,增強(qiáng)了java語言的表現(xiàn)力,拓展了它的應(yīng)用范圍,優(yōu)化了程序的結(jié)構(gòu)與可讀性1 函數(shù)式編程簡介函數(shù)式編程(functional programming)是一種編程模式,旨在將運(yùn)算過程盡量寫成一系列嵌套的函數(shù)調(diào)用。在形式上,函數(shù)式編程允許將函數(shù)作為參數(shù)和返回值;在機(jī)制上,函數(shù)式編程在執(zhí)行時(shí)進(jìn)行惰性計(jì)算(lazy evaluation)和閉包等技術(shù)。最主要的優(yōu)點(diǎn)是不修改狀態(tài),可以將任務(wù)隨意分解,很好的符合了當(dāng)前多線程、多處理器編程的趨勢。2 java中的lambda表達(dá)式lambda()表達(dá)式是jdk8最大的更新之一,旨在
3、引入函數(shù)式編程思想優(yōu)化java程序。其表達(dá)形式如下:(int even, int odd) -> even + odd在jdk8 中,使用->符號(hào)引起表達(dá)式,該符號(hào)左邊為表達(dá)式的參數(shù),右邊為表達(dá)式的行為。lambda表達(dá)式可使用在多種場合,例如作為參數(shù)直接傳入某個(gè)函數(shù):button.addactionlistemer(event->system.out.println(“button clicked!”);其中button是一個(gè)awt button 對(duì)象,由此我們可以看出,在傳統(tǒng)的需要匿名內(nèi)部類的地方可由lambda表達(dá)式代替,另外,傳統(tǒng)的函數(shù)參數(shù)需要一個(gè)對(duì)象,而引入了lam
4、bda表達(dá)式之后,則可以將函數(shù)作為參數(shù)傳入,從而在代碼上更加簡潔。引入lambda表達(dá)式的優(yōu)點(diǎn)首先體現(xiàn)著對(duì)代碼的重構(gòu)上,傳統(tǒng)的java程序有一個(gè)重要的概念即匿名內(nèi)部類,這個(gè)類在某些只使用一次即銷毀的情況下創(chuàng)建,例如常見的為按鈕添加事件button.addactionlistener(new actionlistener() public void actionperformed(actionevent event) system.out.println("button clicked"););但是該代碼當(dāng)中有若干行是純粹的樣板代碼,沒有任何實(shí)際意義,不僅語法冗長,而且破壞了
5、代碼的真實(shí)意圖,而采用lambda表達(dá)式改寫后,該段代碼的目的一目了然,如下所示button.addactionlistener(event->system.out.println("buttonclicked");其次,lambda表達(dá)式配合jdk8新增的的stream類可以提高程序特別是循環(huán)結(jié)構(gòu)的執(zhí)行效率,在jdk8之前,傳統(tǒng)的循環(huán)結(jié)構(gòu)采用的都是外循環(huán)結(jié)構(gòu),例如試圖取得所有來自北京的教師int count = 0;for (teacher teacher : allteachers) if (teacher.isfrom("london") c
6、ount+;可以看到,傳統(tǒng)方式中,集合內(nèi)部的數(shù)據(jù)與外部的循環(huán)語句不停的進(jìn)行交換,外部程序不得不占用一部分空間為結(jié)果集做準(zhǔn)備,從時(shí)間上到空間上都造成了浪費(fèi)。而經(jīng)過lambda表達(dá)式和stream改造,原有的外部循環(huán)成為內(nèi)部循環(huán),如下例所示:long count = allartists.stream().filter(artist -> artist.isfrom("london").count();可以看出,使用lambda表達(dá)式后,內(nèi)部循環(huán)只是在符合條件的集合個(gè)體中做出標(biāo)識(shí),不占用額外內(nèi)存,當(dāng)程序不發(fā)出最后的指令(如要求立即返回結(jié)果)時(shí),內(nèi)部循環(huán)不作出任何操作,稱為
7、lazy模式,這樣就節(jié)省了時(shí)間。3 用lambda表達(dá)式優(yōu)化程序初學(xué)者在使用lambda表達(dá)式時(shí),可將其應(yīng)用在集合操作中,優(yōu)化其操作方式,lambda表達(dá)式與stream類所支持的集合優(yōu)化有map、filter、flatmap以及reduce等,下面將詳細(xì)介紹這幾種方式。在這之前,首先定義一個(gè)領(lǐng)域模型,模仿現(xiàn)實(shí)世界中的某些業(yè)務(wù)需求,這個(gè)領(lǐng)域模型的結(jié)構(gòu)如下作者author,包含名稱(string name)、所屬機(jī)構(gòu)(string origine)和若干成員(string members )著作 book,包含名稱(string name),若干章節(jié)(list chapters)和若干作者(li
8、st authors)章節(jié)chapter,包含章節(jié)名稱(string name)和字?jǐn)?shù)(int chars)作者集合authors,著作集合books和章節(jié)集合chapters。首先來介紹stream類中的第一種操作,即map操作,該操作負(fù)責(zé)將集合當(dāng)中的元素進(jìn)行符合條件的轉(zhuǎn)換。例如,需要所有作者的所屬機(jī)構(gòu)列表,則使用lambda表達(dá)式和stream代碼如下:list origines=authors.stream().map(author->author. getorigine().collect(tolist();第二種常用操作是filter操作,旨在篩選出集合當(dāng)中符合條件的元素,例如
9、,需要找到所有成員數(shù)為1的作者(即該作者不是團(tuán)隊(duì)而是個(gè)人),代碼如下authors.stream().filter(author->author.getmembers().length<2);最后一種常用操作為reduce,該操作類似于數(shù)據(jù)庫中的聚合函數(shù),可對(duì)結(jié)果進(jìn)行各種統(tǒng)計(jì),如匯總、小計(jì)、總計(jì)等,例如要求計(jì)算所有所有作者全部著作的總字?jǐn)?shù),則代碼可以如下:chapters.stream().map(chapter->chapter.getchars().reduce(0,(base,acc)->base+acc);以上介紹了函數(shù)式編程在java中的簡單應(yīng)用,作為java8中最重要的新特性,函數(shù)式編程極大的簡化了代碼的編寫,使得java這一語言煥發(fā)了新的生命力,在未來的開發(fā)中,擁有面向?qū)ο蠹懊嫦蚝瘮?shù)雙重特征的java語言必定會(huì)發(fā)揮更大的作用。參考文獻(xiàn):1 張迎周, 張衛(wèi)豐. haskell:一種現(xiàn)代純函數(shù)式語言j.南京郵電大學(xué)學(xué)報(bào):自然科學(xué)版,2007(4).2 龐建民, 趙
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Mumeose-K-生命科學(xué)試劑-MCE-2774
- 5-Fluoro-THJ-生命科學(xué)試劑-MCE-6389
- 2025年度環(huán)保型空調(diào)拆卸作業(yè)安全協(xié)議書
- 2025年度文化創(chuàng)意產(chǎn)業(yè)居間代理協(xié)議
- 二零二五年度父母出資購房子女房產(chǎn)份額分配協(xié)議
- 2025年度無房產(chǎn)證房屋買賣風(fēng)險(xiǎn)評(píng)估合同
- 二零二五年度砍樹承包合同及林業(yè)資源管理實(shí)施協(xié)議
- 二零二五年度企業(yè)食堂檔口租賃合同與員工餐飲補(bǔ)貼協(xié)議
- 高標(biāo)準(zhǔn)實(shí)驗(yàn)環(huán)境下的安全防護(hù)措施探討
- 臨時(shí)用電安全合同協(xié)議
- 設(shè)計(jì)單位-質(zhì)量管理體系
- 2024版《供電營業(yè)規(guī)則》學(xué)習(xí)考試題庫500題(含答案)
- 福建省醫(yī)院大全
- GB/T 16659-2024煤中汞的測定方法
- 閃蒸罐計(jì)算完整版本
- (高清版)DZT 0073-2016 電阻率剖面法技術(shù)規(guī)程
- 完整2024年開工第一課課件
- 貨運(yùn)車輛駕駛員安全培訓(xùn)內(nèi)容資料完整
- 高一學(xué)期述職報(bào)告
- 風(fēng)神汽車4S店安全生產(chǎn)培訓(xùn)課件
- ICU患者的體位轉(zhuǎn)換與床旁運(yùn)動(dòng)訓(xùn)練
評(píng)論
0/150
提交評(píng)論