當前位置:首頁 » 編程語言 » java什麼是函數式編程

java什麼是函數式編程

發布時間: 2022-06-15 17:34:57

『壹』 到底什麼是函數式編程思維

形而上的思維:
1、數據不可變的思維:let a = 100,意義不是把100賦值給變數a,而是把a符號綁定(或者叫匹配)到100。
2、一切皆表達式思維:if b then 100 else 10,這不是條件跳轉,而是一個三元表達式。
3、函數是第一類值:函數可以作為參數傳輸,也可以作為結果返回,更可以由一個函數演化成另一個函數。

形而下的思維:
1、用遞歸替換循環。
2、難以尾遞歸的時候考慮使用延續函數(continuation)。
3、高階函數、部分應用、Lambda演算。
4、用泛型、介面、可區別聯合類型替換類繼承。
5、用二叉樹替換普通鏈表後可以支持高並發計算。
===================================================

這些也只是feature而不是思維。我想知道的是這些feature之後的邏輯。
-----------------------------------------------------------------------------------------------------
再往上說就不接地氣了,先從函數式語言說起,函數式語言其實就是模仿人的數學思維而發明的樸素,後來因為離機器太遠,不容易優化而被詬病。但科技發展到今天,編譯器的優化能力已經很強,軟體系統越來越復雜,人的分工越來越細,函數式語言離數學更近,離機器更遠,反而成為一種優勢,有助於人把問題清晰化。從這個層面看,函數式編程是一種什麼思維,就是推離機器的數學思維。這里沒有內存、寄存器的想法,在 a=1之後,a 就不可能再等於2,當然你可以在 let a = 1 之後,再 let a = 2,但是這個a 就已經不是那個a,在停留在有內存概念的編程世界裡,a 一直是 a,它是裝東西的桶或者盒子,只是每次裡面裝的東西不同。

那麼,總的來說,是先有樸素的函數式語言,然後才有今天發現函數式編程的好處, 啟用了函數式語言的某些 feature,目的是為了把問題解構成更小的粒度。所以這些feature背後沒什麼邏輯,就好像問這石頭為什麼長這樣一樣。我只能打句偈語:本來就這樣。

『貳』 為什麼函數式編程在java中很危險

因為java是面向對象編程,其特點是易於擴展,開發可重用性非常高。軟體開發中需求變更時很頻繁的。面向過程編程可以很好的應對需求變更,增加擴展功能。函數式編程則不具有這種特點,而且維護起來也十分困難,不利於他人的工作交接。不提倡在java中使用函數式編程。

『叄』 如何理解java8中的函數式編程

JAVA如果真的這么完美無缺,那為什麼還會有其他語言的興盛呢?所以說,沒有一樣東西是絕對完美的,JDK8包括之後的版本,就是不斷的完善JAVA語言,讓它往更好的方向上去走,面向過程有它的缺點,然而無疑也有它的優點,在JAVA8 之前,JAVA欠缺了高效的並行操作,寫一個並行程序代碼往往是費事費力又不討好,然而在JAVA8之上,只需要簡單的修改幾行代碼,就可以讓代碼在多核CPU上完美運行,所以為了達到這個效果,編寫這樣的JDK類庫,就需要在語言層次上修改現有的JAVA,因此,在JAVA中增加Lambda表達式就是刻不容緩的任務了--事實上在2011年的JDK7版本中預計就要引入Lambda,但是因為種種原因,計劃最終推遲到了2014年的JDK8。
  為了達到高效操作集合類,實現並行計算或者操作的目的,你得要學習來自JDK8的新的語法,並且要從面相對象編程的局限中稍微跳出來一些,但是比起之前手寫一大段代碼,我覺得這樣的學習是十分值得也是十分必要的,節省了時間與成本,同時也更不容易出錯!站在巨人的肩膀上,這是任何一個人都需要借鑒的方法,為什麼每次JDK版本的變更都歷時幾年?oracle的工程師並不是傻瓜,尤其是在編寫JDK類庫上,借用他人的代碼並不是可恥的行為,新的代碼更加高效,並且更讓人容易閱讀,這種新代碼更加關注的它所實現的業務邏輯,而並非實現機制,所以你看即使是引入了Lambda,從某種意義上來說,這依舊是面向對象的一種實現方法--關注的並非實現機制,這樣的代碼更容易維護,也更不容易出錯。

『肆』 什麼是函數式編程思維

回答都有跑題,show概念之嫌,題主問的是函數式思維,這個問題我一直在思考,畢竟是方法論,能力有限,只能從切身實踐告訴你
1.表達式化

最初的時候,需要轉變觀念,去可變數,去循環,把命令式改成表達式,注意,這只是把你丟在荒山野嶺讓你感受一下,離開熟悉的環境,地球依然在轉,但是有個
重點,那就是一切都是表達式; 為什麼是表達式呢?這個問題就像為什麼魚在水裡?
因為函數式建立在lambda演算之上而非圖靈機,只不過兩者被證明等價,所以你可以在你的機器上跑全是表達式的代碼,就如有人證明天空適合魚生存,所以
魚可以在天上游
當你接受了魚可以在天上游之後,就該上正餐了

1.5 數據與行為分離
這也是和面向對象不一致的地方,面向對象強調數據與行為綁定,但函數式不是,確切的說函數式 函數與數據等價,所以你才可以將函數當參數與返回值,你在設計時,切勿讓數據自己長腿能跑,其次,行為必須消除副作用,不可以偷偷把數據改了,習慣第一條後,應該不會的

2.高階邏輯

了函數式,就不要在想循環,賦值這些低階邏輯了,而應該更高階的思考問題,這比轉化表達式更難,函數式又叫聲明式,也就是你要做什麼,只要說一下就行,而
非寫個遍歷,做個狀態判斷,用函數式你不需要考慮這些,你不知道函數式的列表是怎麼遍歷的,中間向兩邊?
從後往前?這也是為何函數式適合並發的原因之一,你想知道列表中大於3的數有多少,只要,list.count(_ > 3)
而不是寫循環,你可以直接寫你的業務,不要拘泥於細節,有點像sql, 你需要什麼告訴電腦就行,你或許會問,count foreach filter
這些函數怎麼來的? 因為有了他們你才不需要寫循環,他們把你留在高階邏輯中,這個問題的答案請看下面

3.組合子邏輯 或又叫 自底向上的設計

數式和OO是反的,面向對象是自頂向下的設計,函數式是自底向上的設計,也就是先定義最基本的操作,然後不斷組合,不斷堆積以滿足你的所有需要,如sql
定義了select, from, where...這幾個組合子,來滿足你的查詢需求,同理函數式語言會提供foreach,
map等組合子(操作)來滿足你的需求,所以你必須自下而上的設計你的代碼結構,並且滿足你的需求,當你只用組合子寫代碼時,你會發現你寫的全是高階邏輯

果這些已有組合子滿足不了你,你就得自己寫,foreach不行,你就自己寫遞歸,我告訴你,遞歸背後也是組合子,這里一些'大神'應該不知道,在圖靈機
里,遞歸就是方法不斷調用自己沒什麼好說的,但是在lambda演算中,匿名函數是沒法調用自己的,所以遞歸是用Y組合子(又叫不動點組合子)把遞歸函數
自己求解出來再調用的,這才可以實現遞歸,並與圖靈機的循環等價,有點跑題了,總之要想順手的寫函數式,最好用面向組合子的設計,注意,不是必須,組合子
演算和lambda演算可以相互轉化,也就是,你完全可以寫一堆雜亂的表達式,但沒有組合子邏輯來得清爽,Haskell大規模使用monad這個特殊組
合子,始其變得統一整潔

好了,總結一下
函數式思維,其實就是組合子邏輯,用簡單的幾個函數組合來構建復雜邏輯,始終以高階的角度去表達問題,而非依賴副作用。
知道這點,你用java也可以寫函數式代碼了

但是,這也只是本人積累得來的感悟,絕不敢大肆伸張這就是函數式,我也在不斷研究中,如有問題,還望大神指正

『伍』 java8 函數式編程是什麼

java8完全顛覆我們對java的認識了 函數式編程裡面有一點就是 把一段函數當作是一個參數來進行傳遞

『陸』 php,java,c,python 語言各有什麼不同

簡單的說,它們都是編程語義。是在第三代和第四代編程語言。 都和C有關系。 低層解釋器都是C寫的。都存在進程管理和數據交換。都支持網路編程,資料庫編程。 相互之間可以通訊。

具體來講,對於個掌握多門語言的程序員來講,它們之間差別巨大,以至於沒有人可以同時精通幾門語言。網上簡歷所謂的熟練與精通,幾乎全是假的。

php相對最容易。是函數式編程, java雖然是面向對象的,使用特定的模式後,也可以支持類函數式編程。 c語言是函數式的。 python也是。 但是原則上,它們都同時支持面向對象的編程思維。只是表達方式比較特別。

c語言是比php略難,也是相當容易的語言。
java的工具強大,是一個工程語言。容易學,學精難,工具豐富 ,大多數人在用。是目前最主流的網路服務編程語言。

python仍然是腳本語言之王。 易學,易用,難精通。介面非常豐富。無所不能。

『柒』 java支持的編程範式

Java編程範式

1.命令式編程
核心內容就是:「用語句更改程序的狀態」
大多數流行的編程語言都或多或少基於命令式編程發展而來,命令式語言最典型的實例就是C語言

2.面向對象編程
面向對象編程經常與命令式編程聯系在一起,在實踐當中,兩者是可以共存的。Java就是這種協作的生動證明
面向對象基於四個基本原則:封裝、繼承、多態、抽象

3.聲明式編程
與命令式編程相反,聲明式編程它指定程序應該做什麼,而不具體說明怎麼做。
純粹的聲明式語言包括資料庫查詢語言(如SQL和Xpath)以及正則表達式。
與命令式編程語言相比,聲明式編程語言更加抽象,它們並不模擬硬體結構,因此不會改變程序狀態,而是將它們轉換為新狀態,並且更接近數學邏輯
通常,非命令是的編程範式都被認為屬於聲明式類別。

4.函數式編程
函數式編程是聲明式編程的子範式,與命令式編程相反,函數式變成不會改變程序的內部狀態。
在函數式編程術語中,函數類似於數學函數,函數的輸出僅依賴於其參數,而不管程序的狀態如何,完全不受函數式是何時執行的影響
函數式語言受歡迎的原因之一是它們可以輕松的在並行環境中運行,這與多線程不太一樣,函數式語言支持並行的關鍵在於它們的基本原理:函數僅依賴與輸入參數而不依賴於程序的狀態。它們可以在任何地方運行,然後將多個並行執行的結果連接起來並進一步使用

『捌』 java如何編程

呵呵 問題很有意思!你要是懂編程就知道java是如何編程的了!!!! 編程 :簡單的說,編程就是為了藉助於計算機來達到某一目的或解決某個問題,而使用某種程序設計語言編寫程序代碼,並最終得到結果的過程。
計算機雖然功能十分強大。可以供你上網、打游戲、管理公司人事關系等等,但是沒有程序,它就等於是一堆廢鐵,不會理會我們對它下達的「命令」。於是,我們要馴服它,只有通過一種方式——程序,這也是我們和計算機溝通比較特殊的方式。 [編輯本段]編程原理程序也就是指令的集合,它告訴計算機如何執行特殊的任務。打個比方說,它好比指導你烹調菜品的菜譜或指揮行駛一路到達目的地的交警(或者交通路標)。沒有這些特殊的指令,就不能執行預期的任務。計算機也一樣,當你想讓計算機為你做一件事情的時候,計算機本身並不能主動為我們工作,因此我們必須對它下達指令,而它根本不會也不可能聽懂人類自然語言對事情的描述,因此我們必須使用程序來告訴計算機做什麼事情以及如何去做?甚至對最簡單的任務也需要指令,例如如何取得擊鍵,怎樣在屏幕上放一個字母,怎樣在磁碟中保存文件等等。
上面講到的計算機本身不會主動的做任何事情。因此我們要通過程序的方式來讓計算機為我們「效勞」。而這個過程就是我們「編」出來的。編程可以使用某一種程序設計語言來實現,按照這種語言的語法來描述讓計算機要做的事情。
我們這里所講的語法和外語中的語法完全兩碼事,這里講的語法只是讀你的程序書寫做出一些規定而已。寫出程序後,再由特殊的軟體將你的程序解釋或翻譯成計算機能夠識別的「計算機語言」,然後計算機就可以「聽得懂」你的話了,並會按照你的吩咐去做事了。因此,編程實際上也就是「人給計算機出規則」這么一個過程。 常見的編程語言:* CSS Cascading Style Sheets 層疊樣式表
* .NET 是微軟2002年,為開發應用程序創建的一個富有革命性的新平台
* ActionScript ActionScript是Flash的腳本語言,與JavaScript相似,ActionScript是一種面向對象編程語言。
* APL、A+和J
* Ada Ada是一種表現能力很強的通用程序設計語言
* 匯編語言 匯編語言(Assembly Language)是面向機器的程序設計語言
*易語言是全中文語言編程中最為強大的一個編程語言
* AWK AWK是一種優良的文本處理工具
* Basic 是一種設計給初學者使用的程序設計語言
o QBasic QBASIC是BASIC(Beginner's All-purpose Symbolic Instruction Code,初學者通用指令代碼)語言的一個變種,由美國微軟公司開發
o Visual Basic Visual Basic(VB)是一種由微軟公司開發的包含協助開發環境的事件驅動編程語言
* VBScript VBScript是Visual Basic Script的簡稱,即 Visual Basic 腳本語言
* Brainfuck Brainfuck是一種極小化的計算機語言
* C、C++ 、C# C語言是一種面向過程的計算機程序設計語言 ; C++是一種靜態數據類型檢查的,支持多重編程範式的通用程序設計語言。它支持過程化程序設計、數據抽象、面向對象程序設計、製作圖標等等泛型程序設計等多種程序設計風格。C#是微軟公司發布的一種面向對象的、運行於.NET Framework之上的高級程序設計語言。
o Objective-C 通常寫作ObjC和較少用的Objective C或Obj-C,是擴充C的面向對象編程語言
* Clipper Clipper晶元主要用於商業活動的計算機通信網
* COBOL 一種適合於商業及數據處理的類似英語的程序設計語言
* dBase dBASE是第一個在微型計算機上被廣泛使用的資料庫管理系統(DBMS
* PASCAL、Delphi Pascal是一種計算機通用的高級程序設計語言 ;Delphi是全新的可視化編程環境,是一種方便、快捷的Windows應用程序開發工具
* Forth 由Charles H. Moore發展出來在天文台使用的電腦自動控制系統及程序設計語言,允許使用者很容易組合系統已有的簡單指令,定義成為功能較復雜的高階指令。
* Fortran 譯為「公式翻譯器」,它是世界上最早出現的計算機高級程序設計語言,廣泛應用於科學和工程計算領域。
* FoxPro 是由美國Fox Software公司於1988年推出的資料庫產品
* F# F#是由微軟發展的為微軟.NET語言提供運行環境的程序設計語言
* Fava Fava語言是一個小型的解釋語言,它主要面向於系統測試領域及小型嵌入式設備。
* IDL IDL 是一種數據分析和圖像化應用程序及編程語言
* Java Java是由Sun Microsystems公司於1995年5月推出的Java程序設計語言
* JavaScript Javascript是一種由Netscape的LiveScript發展而來的腳本語言
* J# Visual J# 是一種工具,供 Java 語言程序員用於構建在 .NET Framework 上運行的應用程序和服務
* LISP 一種基於λ演算的函數式編程語言。
* Lua Lua 是一個小巧的腳本語言
* LOGO 是一種早期的編程語言,也是一種與自然語言非常接近的編程語言,它通過「繪圖」的方式來學習編程
* Mole 在軟體工程中,指較高一級程序或模塊使用的一個單元或模塊
* Nuva Nuva語言是一種面向對象的動態腳本語言 Nuva語言的設計目的是用於基於模板的代碼生成
* Perl Perl 一般被稱為「實用報表提取語言」(PracticalExtraction andReportLanguage),也做「病態折中垃圾列表器」(PathologicallyEclectic Rubbish Lister
* PHP PHP 是一種 HTML 內嵌式的語言
* PL/I PL/I是Programming Language One的簡寫。當中的「I」其實是羅馬數字的「一」。它是一隻IBM公司在1950年代發明的第三代高級編程語言
* Prolog Prolog(Programming in Logic的縮寫)是一種邏輯編程語言
* Python 是一種面向對象的解釋性的計算機程序設計語言,也是一種功能強大而完善的通用型語言
* R R是用於統計分析、繪圖的語言和操作環境
* Ruby Ruby,一種為簡單快捷面向對象編程(面向對象程序設計)而創的腳本語言
* Scheme Scheme,一種系統設計語言,由LISP語言發展而來,屬於lisp的一種方言。與其他lisp不同的是,scheme是可以編譯成機器碼的。Scheme的一個主要特性是可以像操作數據一樣操作函數調用
* Smalltalk 一種面向對象的程序設計語言 一種程序設計環境 一個應用開發環境(ADE)
* Tcl/Tk 是一種 腳本語言
* Visual FoxPro Visual FoxPro原名FoxBase,是美國Fox Software公司推出的資料庫產品

『玖』 java lambda表達式是什麼

lambda表達式是JAVA8中提供的一種新的特性,它支持JAVA也能進行簡單的「函數式編程」。它是一個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。

函數式介面:

這個是理解Lambda表達式的重點,也是產生lambda表達式的「母體」,這里我們引用一個比較容易理解的說法:函數式介面是 一個只有一個抽象方法(不包含object中的方法)的介面。

這個需要說明一點,就是在Java中任何一個對象都來自Object 所有介面中自然會繼承自Object中的方法,但在判斷是否是函數式介面的時候要排除Object中的方法。

『拾』 JAVA中構造函數是什麼意思

什麼是構造函數,問的好。
開始的時候我也不理解為什麼要構造函數。因為那時候的設計思想還停留在面向過程編程。即我要干什麼事,這件事有幾個步驟,然後我決定怎麼干。
面向對象不是這么直接簡單,它的設計思想就是要代碼重用。即我以前干過類似的事,那麼我找出以前可以用到的代碼,完成一部分。以前沒有的我重新寫。這樣就有了類。
回到你提的問題。有了類,就是有了可以重用的代碼,但是我怎麼產生這個對象呢。必須要實例化這個類(當然這不是唯一產生對象的途徑,比如單例模式,但本質上說所有途徑都是一樣的)。那麼就要用到構造函數。即告訴程序我現在要實例化一個對象了,你給我馬上分配內存。將內存的首地址賦給我指定的類對象。而且有時候你需要傳遞參數到函數裡面,有了構造函數就方便了,構造函數可以有無數個。當然,傳遞參數到到對象裡面也可以其它方法,比如直接賦一個值給成員變數,舉例:
class point2{
int x,y;

point2(){
}

point2(int a,int b){//構造函數;含參的構造函數;構造方法必須要和類名一致
//且沒有返回值
x=a;
y=b;
}
void output(){
System.out.println(x);
System.out.println(y);
}
public static void main(String args[]){
point2 pt=new point2();//實例化對象,這時候x,y沒有賦值,默認初始值為0;
pt.output();
pt.x=3;pt.y=3;
pt.output();
}
}

熱點內容
pythonmysqlmac安裝 發布:2025-02-07 01:56:36 瀏覽:401
oppoa57忘記密碼怎麼刷機 發布:2025-02-07 01:51:17 瀏覽:73
2016空間加密怎麼進 發布:2025-02-07 01:41:30 瀏覽:382
網路數據伺服器是什麼 發布:2025-02-07 01:23:42 瀏覽:473
多伺服器ip白名單 發布:2025-02-07 01:23:41 瀏覽:372
優酷上傳視頻的格式 發布:2025-02-07 01:18:51 瀏覽:880
租虛擬伺服器有什麼用 發布:2025-02-07 01:17:55 瀏覽:4
視頻腳本策劃 發布:2025-02-07 01:15:37 瀏覽:566
外文免費資料庫 發布:2025-02-07 01:12:26 瀏覽:194
第一滴血ftp 發布:2025-02-07 01:12:24 瀏覽:424