首頁 Java java教程 Java8中關於函數式程式設計的實例講解

Java8中關於函數式程式設計的實例講解

Aug 09, 2017 pm 02:03 PM
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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

使用正規表示式去除 PHP 數組中的重複值 使用正規表示式去除 PHP 數組中的重複值 Apr 26, 2024 pm 04:33 PM

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

程式設計是乾啥的,學了有什麼用 程式設計是乾啥的,學了有什麼用 Apr 28, 2024 pm 01:34 PM

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

使用 Python 解決問題:作為初學者,解鎖強大的解決方案 使用 Python 解決問題:作為初學者,解鎖強大的解決方案 Oct 11, 2024 pm 08:58 PM

Python 讓初學者能夠解決問題。

使用 Golang 建立基於瀏覽器的應用程式 使用 Golang 建立基於瀏覽器的應用程式 Apr 08, 2024 am 09:24 AM

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

透過 Go Get 快速方便地取得 Go 模組 透過 Go Get 快速方便地取得 Go 模組 Apr 07, 2024 pm 09:48 PM

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

C++ 程式設計謎題片段:激發思維,提升程式設計水平 C++ 程式設計謎題片段:激發思維,提升程式設計水平 Jun 01, 2024 pm 10:26 PM

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

釋放你內心的程式設計師:C 絕對初學者 釋放你內心的程式設計師:C 絕對初學者 Oct 11, 2024 pm 03:50 PM

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

編碼的關鍵:為初學者釋放 Python 的力量 編碼的關鍵:為初學者釋放 Python 的力量 Oct 11, 2024 pm 12:17 PM

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

See all articles