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

首頁 Java java教程 Java8中關(guān)于函數(shù)式編程的實(shí)例講解

Java8中關(guān)于函數(shù)式編程的實(shí)例講解

Aug 09, 2017 pm 02:03 PM
java8 實(shí)例 編程

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

前言

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

函數(shù)式的思考

命令式編程

一般我們實(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();
...

聲明式編程

還有一種方式你關(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í)現(xiàn)細(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ù)式編程

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

不同的語言社區(qū)往往對(duì)各自語言中的特性孤芳自賞。現(xiàn)在談Java程序員如何定義函數(shù)式編程還為時(shí)尚早, 但是,這根本不重要!我們關(guān)心的是如何寫出好代碼,而不是符合函數(shù)式編程風(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í)每次調(diào)用也可能會(huì)更行外部的變量值,這樣的函數(shù)我們稱之為是有副作用的函數(shù)。

在函數(shù)式編程的上下文中,一個(gè)“函數(shù)”對(duì)應(yīng)于一個(gè)數(shù)學(xué)函數(shù):它接受零個(gè)或多個(gè)參數(shù),生成一個(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ù)之間的區(qū)別是非常重要的(我們無法想象,log或者sin這樣的數(shù)學(xué)函數(shù)會(huì)有副作用)。 尤其是,使用同樣的參數(shù)調(diào)用數(shù)學(xué)函數(shù),它所返回的結(jié)果一定是相同的。這里,我們暫時(shí)不考慮Random.nextInt這樣的方法,

函數(shù)的副作用

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

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

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

我們構(gòu)建函數(shù)式的準(zhǔn)則是,被稱為“函數(shù)式”的函數(shù)或方法都只能修改局部變量,除此之外,它引用的對(duì)象都應(yīng)該是final的。 所有的引用類型字段都指向不可變對(duì)象。

總結(jié)

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

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系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脫衣機(jī)

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é)者能夠解決問題。其用戶友好的語法、廣泛的庫以及變量、條件語句和循環(huán)等功能可實(shí)現(xiàn)高效的代碼開發(fā)。從管理數(shù)據(jù)到控制程序流程和執(zhí)行重復(fù)任務(wù),Python 提供了

釋放你內(nèi)心的程序員:C 絕對(duì)初學(xué)者 釋放你內(nèi)心的程序員:C 絕對(duì)初學(xué)者 Oct 11, 2024 pm 03:50 PM

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

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

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

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

Python通過其易學(xué)性和強(qiáng)大功能,是初學(xué)者的理想編程入門語言。其基礎(chǔ)包括:變量:用于存儲(chǔ)數(shù)據(jù)(數(shù)字、字符串、列表等)。數(shù)據(jù)類型:定義變量中數(shù)據(jù)的類型(整數(shù)、浮點(diǎn)數(shù)等)。運(yùn)算符:用于數(shù)學(xué)運(yùn)算和比較。控制流:控制代碼執(zhí)行流(條件語句、循環(huán))。

揭秘 C:為新程序員提供一條清晰簡(jiǎn)單的道路 揭秘 C:為新程序員提供一條清晰簡(jiǎn)單的道路 Oct 11, 2024 pm 10:47 PM

C是一種初學(xué)者學(xué)習(xí)系統(tǒng)編程的理想選擇,它包含以下組件:頭文件、函數(shù)和主函數(shù)。一個(gè)簡(jiǎn)單的C程序可以打印“HelloWorld”,需要包含標(biāo)準(zhǔn)輸入/輸出函數(shù)聲明的頭文件,并在主函數(shù)中使用printf函數(shù)來打印。通過使用GCC編譯器可以編譯和運(yùn)行C程序。掌握基礎(chǔ)后,可以繼續(xù)學(xué)習(xí)數(shù)據(jù)類型、函數(shù)、數(shù)組和文件處理等主題,以成為熟練的C程序員。

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

Java是熱門編程語言,適合初學(xué)者和經(jīng)驗(yàn)豐富的開發(fā)者學(xué)習(xí)。本教程從基礎(chǔ)概念出發(fā),逐步深入講解高級(jí)主題。安裝Java開發(fā)工具包后,可通過創(chuàng)建簡(jiǎn)單的“Hello,World!”程序?qū)嵺`編程。理解代碼后,使用命令提示符編譯并運(yùn)行程序,控制臺(tái)上將輸出“Hello,World!”。學(xué)習(xí)Java開啟了編程之旅,隨著掌握程度加深,可創(chuàng)建更復(fù)雜的應(yīng)用程序。

Java 變得簡(jiǎn)單:編程能力的初學(xué)者指南 Java 變得簡(jiǎn)單:編程能力的初學(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í)編程的理想選擇。基本語法Java使用基于類的面向?qū)ο缶幊谭妒?。類是將相關(guān)數(shù)據(jù)和行為組織在一起的模板。以下是一個(gè)簡(jiǎn)單的Java類示例:publicclassPerson{privateStringname;privateintage;

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

C語言,作為編程基礎(chǔ),憑借其高效性和通用性,為初學(xué)者開啟編程大門。其簡(jiǎn)單語法由關(guān)鍵字、標(biāo)識(shí)符、數(shù)據(jù)類型和操作符構(gòu)成。變量用于存儲(chǔ)數(shù)據(jù),數(shù)據(jù)類型決定了變量的范圍。運(yùn)算符對(duì)數(shù)據(jù)進(jìn)行操作,表達(dá)式用于計(jì)算值??刂屏髡Z句控制程序執(zhí)行順序,包括if、for和while循環(huán)。函數(shù)是可重用的代碼塊,可接受參數(shù)并返回值。實(shí)戰(zhàn)案例中,C語言程序可計(jì)算圓的面積,讀取半徑并使用公式計(jì)算面積,輸出結(jié)果。

See all articles