Java8中關於函數式程式設計的實例講解
函數式編程,這個詞語由兩個名詞構成,函數,編程。程式設計這個詞我就不用解釋了,大家都是做這個的。函數,其實單獨抽離出來這個詞語,也不陌生,那二者組合後的到底是什麼呢,下面這篇文章主要給大家介紹了關於Java8函數式編程的相關資料,需要的朋友可以參考下。
前言
在先前的一篇文章中我們快速學習了lambda和Stream,本章節中我們來回顧和理解函數式程式設計的思想。 我們不斷的提及函數式這個名詞,它指的是lambda嗎?如果是這樣,採用函數式程式設計能為你帶來什麼好處呢?
函數式的思考
命令式程式設計
一般我們實現一個系統有兩種思考方式,一種專注於如何實現,例如下廚做菜,通常按照自己熟悉的烹飪方法:首先洗菜, 然後切菜,熱油,下菜,然後… 這看起來像是一系列的命令合集。對於這種」如何做」式的編程風格我們稱之為命令式編程, 它的特點非常像工廠的流水線、計算機的指令處理,都是串行化、命令式的。
CookingTask cookingTask = new CookingTask(); cookingTask.wash(); cookingTask.cut(); cookingTask.deepFry(); cookingTask.fried(); ...
聲明式程式設計
還有一種方式你關注的是要做什麼,我們如果用lambda和函數式來解決上述問題應該是這樣的:
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("炒菜")); } }
這裡我們將烹飪的實作細節交給了函數庫,它最大的優勢在於你讀起來就像是在問題陳述,採用這種方式我們很快可以理解它的功能, 當你在烹飪流程中添加其他步驟也變得非常簡單,你只需要調用doTask方法將材料傳遞進去處理,比如在食用油燒熱前我要打個雞蛋
cookingDemo.doTask("鸡蛋", material -> System.out.println(material + "打碎搅拌均匀"));
而不用再寫一個處理雞蛋的方法。
什麼是函數式程式設計
對於「什麼是函數式程式設計」這一問題最簡化的答案是「它是一種使用函數進行程式設計的方式」。 每個人的理解都是不同的,其核心是:在思考問題時,使用不可變值和函數,函數對一個值進行處理,並映射成另一個值。
不同的語言社群往往對各自語言中的特性孤芳自賞。現在談Java程式設計師如何定義函數式程式設計還為時過早, 但是,這根本不重要!我們關心的是如何寫出好程式碼,而不是符合函數式程式設計風格的程式碼。
我們想像設計一個函數,輸入一個字串類型和布林類型參數,輸出一個整形參數。
int pos = 0; public Integer foo(String str, boolea flag){ if(flag && null != str){ pos++; } return pos; }
這個例子有輸入也有輸出,同時每次呼叫也可能會更行外部的變數值,這樣的函數我們稱之為是有副作用的函數。
在函數式程式設計的上下文中,一個「函數」對應於一個數學函數:它接受零個或多個參數,產生一個或多個結果,並且不會有任何副作用。 你可以把它看成一個黑盒,它接收輸入並產生一些輸出,像下面的函數
public Integer foo(String str, boolea flag){ if(flag && null != str){ return 1; } return 0; }
這種類型的函數和你在Java程式語言中看到的函數之間的差異是非常重要的(我們無法想像,log或sin這樣的數學函數會有副作用)。 尤其是,使用同樣的參數來呼叫數學函數,它所傳回的結果一定是相同的。這裡,我們暫時不考慮Random.nextInt這樣的方法,
函數的副作用
當談論「函數式」時,我們想說的其實是「像數學函數那樣——沒有副作用」。由此,程式設計上的一些精妙問題隨之而來。 我們的意思是,每個函數都只能使用函數和像if-then-else這樣的數學思想來建構嗎? 或者,我們也允許函數內部執行一些非函數式的操作,只要這些操作的結果不會暴露給系統中的其他部分? 換句話說,如果程式有一定的副作用,不過該副作用不會為其他的呼叫者感知,是否我們能假設這種副作用不存在呢? 呼叫者不需要知道,或完全不在乎這些副作用,因為這對它完全沒有影響。
當我們希望能界定這二者之間的區別時,我們將第一種稱為純粹的函數式編程,後者稱為函數式編程。
在程式實戰中我們很難用Java語言以純粹的函數式來完成一個程式的,因為很多舊的程式碼包含標準函式庫的函數都是有副作用的(呼叫Scanner.nextLine就有副作用,它會從一個檔案中讀取一行, 通常情況兩次呼叫的結果完全不同)。你希望為你的系統 編寫接近純函數式的實現,需要確保你的程式碼沒有副作用。假設這樣一個函數或方法,它沒有副作用,進入方法體執行時會對一個字段的值加一, 退出方法體之前會對該字段減一。對一個單線程的程式而言,這個方法是沒有副作用的,可以看作函數式的實作。
我們建立函數式的準則是,被稱為「函數式」的函數或方法都只能修改局部變量,除此之外,它所引用的物件都應該是final的。 所有的引用類型欄位都指向不可變物件。
總結
#以上是Java8中關於函數式程式設計的實例講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

使用正規表示式從PHP數組中移除重複值的方法:使用正規表示式/(.*)(.+)/i匹配並取代重複項。遍歷數組元素,使用preg_match檢查匹配情況。如果匹配,請跳過值;否則,將其添加到無重複值的新數組中。

1、程式設計可用於開發各種軟體和應用程序,包括網站、手機應用程式、遊戲和數據分析工具等。它的應用領域非常廣泛,幾乎涵蓋了所有行業,包括科學研究、醫療保健、金融、教育、娛樂等。 2.學習程式設計可以幫助我們提升問題解決能力和邏輯思考能力。在程式設計過程中,我們需要分析和理解問題,找出解決方案,並將其轉換為程式碼。這種思維方式能夠培養我們的分析和抽象能力,提升我們解決實際問題的能力。

使用Golang建立基於瀏覽器的應用程式Golang結合JavaScript建構了動態的前端體驗。安裝Golang:造訪https://golang.org/doc/install。設定Golang專案:建立一個名為main.go的檔案。使用GorillaWebToolkit:新增GorillaWebToolkit程式碼以處理HTTP請求。建立HTML模板:在templates子目錄中建立index.html,這是主模板。

透過GoGet,可以快速且方便地取得Go模組,步驟如下:在終端機中執行:goget[module-path],其中module-path為模組路徑。 GoGet會自動下載模組及其相依性。安裝的位置由GOPATH環境變數指定。

C++程式設計謎題涵蓋斐波那契數列、階乘、漢明距離、陣列最大值和最小值等演算法和資料結構概念,透過解決這些謎題,可以鞏固C++知識,提升演算法理解和程式設計技巧。

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

Python透過其易學性和強大功能,是初學者的理想程式設計入門語言。其基礎包括:變數:用於儲存資料(數字、字串、列表等)。資料型態:定義變數中資料的型態(整數、浮點數等)。運算符:用於數學運算和比較。控制流程:控製程式碼執行流程(條件語句、迴圈)。
