国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 Java java教程 Java8中關(guān)於函數(shù)式程式設(shè)計(jì)的實(shí)例講解

Java8中關(guān)於函數(shù)式程式設(shè)計(jì)的實(shí)例講解

Aug 09, 2017 pm 02:03 PM
java8 實(shí)例 程式設(shè)計(jì)

函數(shù)式編程,這個(gè)詞語由兩個(gè)名詞構(gòu)成,函數(shù),編程。程式設(shè)計(jì)這個(gè)詞我就不用解釋了,大家都是做這個(gè)的。函數(shù),其實(shí)單獨(dú)抽離出來這個(gè)詞語,也不陌生,那二者組合後的到底是什麼呢,下面這篇文章主要給大家介紹了關(guān)於Java8函數(shù)式編程的相關(guān)資料,需要的朋友可以參考下。

前言

在先前的一篇文章中我們快速學(xué)習(xí)了lambda和Stream,本章節(jié)中我們來回顧和理解函數(shù)式程式設(shè)計(jì)的思想。 我們不斷的提及函數(shù)式這個(gè)名詞,它指的是lambda嗎?如果是這樣,採用函數(shù)式程式設(shè)計(jì)能為你帶來什麼好處呢?

函數(shù)式的思考

命令式程式設(shè)計(jì)

一般我們實(shí)現(xiàn)一個(gè)系統(tǒng)有兩種思考方式,一種專注於如何實(shí)現(xiàn),例如下廚做菜,通常按照自己熟悉的烹飪方法:首先洗菜, 然後切菜,熱油,下菜,然後… 這看起來像是一系列的命令合集。對(duì)於這種」如何做」式的編程風(fēng)格我們稱之為命令式編程, 它的特點(diǎn)非常像工廠的流水線、計(jì)算機(jī)的指令處理,都是串行化、命令式的。


CookingTask cookingTask = new CookingTask();
cookingTask.wash();
cookingTask.cut();
cookingTask.deepFry();
cookingTask.fried();
...

聲明式程式設(shè)計(jì)

還有一種方式你關(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("炒菜"));
 }
}

這裡我們將烹飪的實(shí)作細(xì)節(jié)交給了函數(shù)庫,它最大的優(yōu)勢(shì)在於你讀起來就像是在問題陳述,採用這種方式我們很快可以理解它的功能, 當(dāng)你在烹飪流程中添加其他步驟也變得非常簡(jiǎn)單,你只需要調(diào)用doTask方法將材料傳遞進(jìn)去處理,比如在食用油燒熱前我要打個(gè)雞蛋


cookingDemo.doTask("雞蛋", material -> System.out.println(material + "打碎攪拌均勻"));

而不用再寫一個(gè)處理雞蛋的方法。

什麼是函數(shù)式程式設(shè)計(jì)

對(duì)於「什麼是函數(shù)式程式設(shè)計(jì)」這一問題最簡(jiǎn)化的答案是「它是一種使用函數(shù)進(jìn)行程式設(shè)計(jì)的方式」。 每個(gè)人的理解都是不同的,其核心是:在思考問題時(shí),使用不可變值和函數(shù),函數(shù)對(duì)一個(gè)值進(jìn)行處理,並映射成另一個(gè)值。

不同的語言社群往往對(duì)各自語言中的特性孤芳自賞?,F(xiàn)在談Java程式設(shè)計(jì)師如何定義函數(shù)式程式設(shè)計(jì)還為時(shí)過早, 但是,這根本不重要!我們關(guān)心的是如何寫出好程式碼,而不是符合函數(shù)式程式設(shè)計(jì)風(fēng)格的程式碼。

我們想像設(shè)計(jì)一個(gè)函數(shù),輸入一個(gè)字串類型和布林類型參數(shù),輸出一個(gè)整形參數(shù)。


int pos = 0;
public Integer foo(String str, boolea flag){
 if(flag && null != str){
  pos++;
 }
 return pos;
}

這個(gè)例子有輸入也有輸出,同時(shí)每次呼叫也可能會(huì)更行外部的變數(shù)值,這樣的函數(shù)我們稱之為是有副作用的函數(shù)。

在函數(shù)式程式設(shè)計(jì)的上下文中,一個(gè)「函數(shù)」對(duì)應(yīng)於一個(gè)數(shù)學(xué)函數(shù):它接受零個(gè)或多個(gè)參數(shù),產(chǎn)生一個(gè)或多個(gè)結(jié)果,並且不會(huì)有任何副作用。 你可以把它看成一個(gè)黑盒,它接收輸入並產(chǎn)生一些輸出,像下面的函數(shù)


#
public Integer foo(String str, boolea flag){
 if(flag && null != str){
  return 1;
 }
 return 0;
}

這種類型的函數(shù)和你在Java程式語言中看到的函數(shù)之間的差異是非常重要的(我們無法想像,log或sin這樣的數(shù)學(xué)函數(shù)會(huì)有副作用)。 尤其是,使用同樣的參數(shù)來呼叫數(shù)學(xué)函數(shù),它所傳回的結(jié)果一定是相同的。這裡,我們暫時(shí)不考慮Random.nextInt這樣的方法,

函數(shù)的副作用

當(dāng)談?wù)摗负瘮?shù)式」時(shí),我們想說的其實(shí)是「像數(shù)學(xué)函數(shù)那樣——沒有副作用」。由此,程式設(shè)計(jì)上的一些精妙問題隨之而來。 我們的意思是,每個(gè)函數(shù)都只能使用函數(shù)和像if-then-else這樣的數(shù)學(xué)思想來建構(gòu)嗎? 或者,我們也允許函數(shù)內(nèi)部執(zhí)行一些非函數(shù)式的操作,只要這些操作的結(jié)果不會(huì)暴露給系統(tǒng)中的其他部分? 換句話說,如果程式有一定的副作用,不過該副作用不會(huì)為其他的呼叫者感知,是否我們能假設(shè)這種副作用不存在呢? 呼叫者不需要知道,或完全不在乎這些副作用,因?yàn)檫@對(duì)它完全沒有影響。

當(dāng)我們希望能界定這二者之間的區(qū)別時(shí),我們將第一種稱為純粹的函數(shù)式編程,後者稱為函數(shù)式編程。

在程式實(shí)戰(zhàn)中我們很難用Java語言以純粹的函數(shù)式來完成一個(gè)程式的,因?yàn)楹芏嗯f的程式碼包含標(biāo)準(zhǔn)函式庫的函數(shù)都是有副作用的(呼叫Scanner.nextLine就有副作用,它會(huì)從一個(gè)檔案中讀取一行, 通常情況兩次呼叫的結(jié)果完全不同)。你希望為你的系統(tǒng) 編寫接近純函數(shù)式的實(shí)現(xiàn),需要確保你的程式碼沒有副作用。假設(shè)這樣一個(gè)函數(shù)或方法,它沒有副作用,進(jìn)入方法體執(zhí)行時(shí)會(huì)對(duì)一個(gè)字段的值加一, 退出方法體之前會(huì)對(duì)該字段減一。對(duì)一個(gè)單線程的程式而言,這個(gè)方法是沒有副作用的,可以看作函數(shù)式的實(shí)作。

我們建立函數(shù)式的準(zhǔn)則是,被稱為「函數(shù)式」的函數(shù)或方法都只能修改局部變量,除此之外,它所引用的物件都應(yīng)該是final的。 所有的引用類型欄位都指向不可變物件。

總結(jié)

#

以上是Java8中關(guān)於函數(shù)式程式設(shè)計(jì)的實(shí)例講解的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

使用 Python 解決問題:作為初學(xué)者,解鎖強(qiáng)大的解決方案 使用 Python 解決問題:作為初學(xué)者,解鎖強(qiáng)大的解決方案 Oct 11, 2024 pm 08:58 PM

Python 讓初學(xué)者能夠解決問題。

釋放你內(nèi)心的程式設(shè)計(jì)師:C 絕對(duì)初學(xué)者 釋放你內(nèi)心的程式設(shè)計(jì)師:C 絕對(duì)初學(xué)者 Oct 11, 2024 pm 03:50 PM

C語言是初學(xué)者學(xué)習(xí)程式設(shè)計(jì)的理想選擇,其優(yōu)點(diǎn)包括效率、多功能性和可移植性。學(xué)習(xí)C語言需要:安裝C編譯器(如MinGW或Cygwin)了解變數(shù)、資料型別、條件語句和迴圈語句編寫包含主函數(shù)和printf()函數(shù)的第一個(gè)程式透過實(shí)戰(zhàn)案例(如計(jì)算平均數(shù))練習(xí)C語言知識(shí)

Python 的力量,簡(jiǎn)單:一種適合初學(xué)者的程式設(shè)計(jì)方法 Python 的力量,簡(jiǎn)單:一種適合初學(xué)者的程式設(shè)計(jì)方法 Oct 11, 2024 pm 04:53 PM

Python程式設(shè)計(jì)入門安裝Python:從官方網(wǎng)站下載並安裝。 HelloWorld!:使用print("HelloWorld!")列印第一行程式碼。實(shí)戰(zhàn)案例:計(jì)算圓面積:使用π(3.14159)和半徑計(jì)算圓面積。變數(shù)和資料類型:使用變數(shù)儲(chǔ)存數(shù)據(jù),Python中的資料類型包括整數(shù)、浮點(diǎn)數(shù)、字串和布林值。表達(dá)式與賦值:使用運(yùn)算子將變數(shù)、常數(shù)和函數(shù)連接起來,並使用賦值運(yùn)算子(=)將值賦給變數(shù)??刂屏鞒蹋篿f-else語句:根據(jù)條件執(zhí)行不同的程式碼區(qū)塊,確定奇

編碼的關(guān)鍵:為初學(xué)者釋放 Python 的力量 編碼的關(guān)鍵:為初學(xué)者釋放 Python 的力量 Oct 11, 2024 pm 12:17 PM

Python透過其易學(xué)性和??強(qiáng)大功能,是初學(xué)者的理想程式設(shè)計(jì)入門語言。其基礎(chǔ)包括:變數(shù):用於儲(chǔ)存資料(數(shù)字、字串、列表等)。資料型態(tài):定義變數(shù)中資料的型態(tài)(整數(shù)、浮點(diǎn)數(shù)等)。運(yùn)算符:用於數(shù)學(xué)運(yùn)算和比較??刂屏鞒蹋嚎匮u程式碼執(zhí)行流程(條件語句、迴圈)。

揭秘 C:為新程式設(shè)計(jì)師提供一條清晰簡(jiǎn)單的道路 揭秘 C:為新程式設(shè)計(jì)師提供一條清晰簡(jiǎn)單的道路 Oct 11, 2024 pm 10:47 PM

C是初學(xué)者學(xué)習(xí)系統(tǒng)程式設(shè)計(jì)的理想選擇,它包含以下元件:頭檔、函數(shù)和主函數(shù)。一個(gè)簡(jiǎn)單的C程式可以列印“HelloWorld”,需要包含標(biāo)準(zhǔn)輸入/輸出函數(shù)聲明的頭文件,並在主函數(shù)中使用printf函數(shù)來列印。透過使用GCC編譯器可以編譯和執(zhí)行C程式。掌握基礎(chǔ)後,可以繼續(xù)學(xué)習(xí)資料類型、函數(shù)、陣列和文件處理等主題,以成為熟練的C程式設(shè)計(jì)師。

創(chuàng)造未來:零基礎(chǔ)的 Java 編程 創(chuàng)造未來:零基礎(chǔ)的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學(xué)者和經(jīng)驗(yàn)豐富的開發(fā)者學(xué)習(xí)。本教學(xué)從基礎(chǔ)概念出發(fā),逐步深入解說進(jìn)階主題。安裝Java開發(fā)工具包後,可透過建立簡(jiǎn)單的「Hello,World!」程式來實(shí)踐程式設(shè)計(jì)。理解程式碼後,使用命令提示字元編譯並執(zhí)行程序,控制臺(tái)上將輸出「Hello,World!」。學(xué)習(xí)Java開啟了程式設(shè)計(jì)之旅,隨著掌握程度加深,可創(chuàng)建更複雜的應(yīng)用程式。

Java 變得簡(jiǎn)單:程式設(shè)計(jì)能力的初學(xué)者指南 Java 變得簡(jiǎn)單:程式設(shè)計(jì)能力的初學(xué)者指南 Oct 11, 2024 pm 06:30 PM

JavaMadeSimple:ABeginner'sGuidetoProgrammingPower簡(jiǎn)介Java是一種強(qiáng)大的程式語言,廣泛應(yīng)用於從行動(dòng)應(yīng)用程式到企業(yè)級(jí)系統(tǒng)的各種領(lǐng)域。對(duì)於初學(xué)者來說,Java的文法簡(jiǎn)潔易懂,是學(xué)習(xí)程式設(shè)計(jì)的理想選擇。基本語法Java使用基於類別的物件導(dǎo)向程式設(shè)計(jì)範(fàn)式。類別是將相關(guān)資料和行為組織在一起的範(fàn)本。以下是一個(gè)簡(jiǎn)單的Java類別範(fàn)例:publicclassPerson{privateStringname;privateintage;

編碼的關(guān)鍵:為初學(xué)者釋放 C 的力量 編碼的關(guān)鍵:為初學(xué)者釋放 C 的力量 Oct 13, 2024 am 11:44 AM

C語言,作為程式設(shè)計(jì)基礎(chǔ),憑藉其高效性和通用性,為初學(xué)者開啟程式設(shè)計(jì)大門。其簡(jiǎn)單語法由關(guān)鍵字、識(shí)別碼、資料類型和操作符構(gòu)成。變數(shù)用於儲(chǔ)存數(shù)據(jù),資料類型決定了變數(shù)的範(fàn)圍。運(yùn)算子對(duì)資料進(jìn)行操作,表達(dá)式用於計(jì)算值??刂屏鞒陶Z句控製程式執(zhí)行順序,包括if、for和while迴圈。函數(shù)是可重複使用的程式碼區(qū)塊,可接受參數(shù)並傳回值。實(shí)戰(zhàn)案例中,C語言程式可計(jì)算圓的面積,讀取半徑並使用公式計(jì)算面積,輸出結(jié)果。

See all articles