国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

分享關(guān)于Java語言中的函數(shù)編程

2019-11-17 06:34:36
字體:
供稿:網(wǎng)友

  假如您從事大型企業(yè)項(xiàng)目開發(fā),您就會(huì)熟悉編寫模塊化代碼的好處。良構(gòu)的、模塊化的代碼更輕易編寫、調(diào)試、理解和重用。java 開發(fā)人員的問題是,函數(shù)編程范型長期以來只是通過像 Haskell、Scheme、Erlang 和 Lisp 這樣的非凡語言實(shí)現(xiàn)的。在本文中,作者 Abhijit Belapurkar 展示了,如何使用像閉包(closure)和 高階函數(shù)(higher order function)這樣的函數(shù)編程結(jié)構(gòu),在 Java 語言中編寫良構(gòu)的、模塊化的代碼。
  
  Java 語言中常被忽視的一個(gè)方面是它被歸類為一種命令式(imperative)編程語言。命令式編程雖然由于與 Java 語言的關(guān)聯(lián)而相當(dāng)普及,但是并不是惟一可用的編程風(fēng)格,也不總是最有效的。在本文中,我將探討在 Java 開發(fā)實(shí)踐中加入不同的編程方法 ── 即函數(shù)編程(FP)。
  
  命令式編程是一種用程序狀態(tài)描述計(jì)算的方法。使用這種范型的編程人員用語句改變程序狀態(tài)。這就是為什么,像 Java 這樣的程序是由一系列讓計(jì)算機(jī)執(zhí)行的命令 (或者語句) 所組成的。 另一方面, 函數(shù)編程是一種強(qiáng)調(diào)表達(dá)式的計(jì)算而非命令的執(zhí)行的一種編程風(fēng)格。表達(dá)式是用函數(shù)結(jié)合基本值構(gòu)成的,它類似于用參數(shù)調(diào)用函數(shù)。
  
  本文將介紹函數(shù)編程的基本特點(diǎn),但是重點(diǎn)放在兩個(gè)非凡適用于 Java 開發(fā)框架的元素:閉包和高階函數(shù)。假如您曾經(jīng)使用過像 Python、Ruby 或者 Groovy (請參閱 參考資料) 這樣的靈敏開發(fā)語言,那么您就可能已經(jīng)碰到過這些元素。在這里,您將看到在 Java 開發(fā)框架中直接使用它們會(huì)出現(xiàn)什么情況。我將首先對函數(shù)編程及其核心元素做一個(gè)簡短的、概念性的綜述,然后用常用的編程場景展示,用結(jié)構(gòu)化的方式使用閉包和高階函數(shù)會(huì)給 Java 代碼帶來什么好處。
  
  什么是函數(shù)編程?
  
  在經(jīng)常被引用的論文 “Why Functional PRogramming Matters”(請參閱 參考資料) 中,作者 John Hughes 說明了模塊化是成功編程的要害,而函數(shù)編程可以極大地改進(jìn)模塊化。在函數(shù)編程中,編程人員有一個(gè)天然框架用來開發(fā)更小的、更簡單的和更一般化的模塊, 然后將它們組合在一起。函數(shù)編程的一些基本特點(diǎn)包括:
  
  支持閉包和高階函數(shù)。
  支持懶惰計(jì)算(lazy evaluation)。
  使用遞歸作為控制流程的機(jī)制。
  加強(qiáng)了引用透明性。
  沒有副作用。
  
  我將重點(diǎn)放在在 Java 語言中使用閉包和高階函數(shù)上,但是首先對上面列出的所有特點(diǎn)做一個(gè)概述。
  
  閉包和高階函數(shù)
  
  函數(shù)編程支持函數(shù)作為第一類對象,有時(shí)稱為 閉包或者 仿函數(shù)(functor)對象。實(shí)質(zhì)上,閉包是起函數(shù)的作用并可以像對象一樣操作的對象。與此類似,F(xiàn)P 語言支持 高階函數(shù)。高階函數(shù)可以用另一個(gè)函數(shù)(間接地,用一個(gè)表達(dá)式) 作為其輸入?yún)?shù),在某些情況下,它甚至返回一個(gè)函數(shù)作為其輸出參數(shù)。這兩種結(jié)構(gòu)結(jié)合在一起使得可以用優(yōu)雅的方式進(jìn)行模塊化編程,這是使用 FP 的最大好處。
  
  命令式編程
  
  命令式編程這個(gè)名字是從自然語言(比如英語)的 祈使語氣(imperative mood)衍生出來的,在這種語氣中公布命令并按照執(zhí)行。除 Java 語言之外,C 和 C++ 是另外兩種廣泛使用的、符合命令式風(fēng)格的高級(jí)編程語言。
  
  懶惰計(jì)算
  
  除了高階函數(shù)和仿函數(shù)(或閉包)的概念,F(xiàn)P 還引入了 懶惰計(jì)算的概念。在懶惰計(jì)算中,表達(dá)式不是在綁定到變量時(shí)立即計(jì)算,而是在求值程序需要產(chǎn)生表達(dá)式的值時(shí)進(jìn)行計(jì)算。延遲的計(jì)算使您可以編寫可能潛在地生成無窮輸出的函數(shù)。因?yàn)椴粫?huì)計(jì)算多于程序的其余部分所需要的值,所以不需要擔(dān)心由無窮計(jì)算所導(dǎo)致的 out-of-memory 錯(cuò)誤。一個(gè)懶惰計(jì)算的例子是生成無窮 Fibonacci 列表的函數(shù),但是對 第 n 個(gè)Fibonacci 數(shù)的計(jì)算相當(dāng)于只是從可能的無窮列表中提取一項(xiàng)。
  
  遞歸
  
  FP 還有一個(gè)特點(diǎn)是用遞歸做為控制流程的機(jī)制。例如,Lisp 處理的列表定義為在頭元素后面有子列表,這種表示法使得它自己自然地對更小的子列表不斷遞歸。
  
  關(guān)于實(shí)現(xiàn)庫
  
  我使用了由 Apache Commons Functor 項(xiàng)目提供的庫構(gòu)建本文使用的例子。Apache Commons Functor 庫包括大量基本構(gòu)造,可以在涉及閉包和高階函數(shù)的復(fù)雜使用場景中重復(fù)使用。當(dāng)然,可以使用不同的實(shí)現(xiàn)(如 Java Generic Libraries、Mango 或者 Generic Algorithms for Java),而不會(huì)對在本文中所討論和展示的概念有影響,盡管您必須下載和使用 Apache Commons Functor 庫才能演示這里的例子。
  
  引用透明性
  
  函數(shù)程序通常還加強(qiáng) 引用透明性,即假如提供同樣的輸入,那么函數(shù)總是返回同樣的結(jié)果。就是說,表達(dá)式的值不依靠于可以改變值的全局狀態(tài)。這使您可以從形式上推斷程序行為,因?yàn)楸磉_(dá)式的意義只取決于其子表達(dá)式而不是計(jì)算順序或者其他表達(dá)式的副作用。這有助于驗(yàn)證正確性、簡化算法,甚至有助于找出優(yōu)化它的方法。
  
  副作用
  
  副作用是修改系統(tǒng)狀態(tài)的語言結(jié)構(gòu)。因?yàn)?FP 語言不包含任何賦值語句,變量值一旦被指派就永遠(yuǎn)不會(huì)改變。而且,調(diào)用函數(shù)只會(huì)計(jì)算出結(jié)果 ── 不會(huì)出現(xiàn)其他效果。因此,F(xiàn)P 語言沒有副作用。
  
  這些基本描述應(yīng)足以讓您完成本文中的函數(shù)編程例子。有關(guān)這個(gè)主題的更多參考資料請參閱 參考資料一節(jié)。
  
  Java 語言中的函數(shù)編程
  
  不管是否相信,在 Java 開發(fā)實(shí)踐中您可能已經(jīng)碰到過閉包和高階函數(shù),盡管當(dāng)時(shí)您可能沒有意識(shí)到。例如,許多 Java 開發(fā)人員在匿名內(nèi)部類中封閉 Java 代碼的一個(gè)詞匯單元(lexical unit)時(shí)第一次碰到了 閉包。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新竹市| 托克托县| 桓台县| 扬中市| 伊宁市| 青田县| 湘潭市| 安丘市| 揭东县| 当雄县| 吉木萨尔县| 安阳市| 东兴市| 布拖县| 成武县| 和平县| 舟曲县| 洪湖市| 茂名市| 长岛县| 西乡县| 柘城县| 巫溪县| 台中县| 阳泉市| 清丰县| 阿克陶县| 磴口县| 古交市| 定州市| 彰化县| 江津市| 鹿邑县| 元阳县| 喀喇| 彭山县| 大名县| 无极县| 抚顺市| 嫩江县| 东台市|