麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

分享關于Java語言中的函數編程

2019-11-17 06:34:36
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美一级色片 | 毛片免费看电影 | 250pp久久新 黄色网址免费在线播放 | 国产98色| 午夜在线观看视频网站 | 久久精品一区二区三 | 中文字幕xxx | www.成人免费 | 久久蜜桃精品一区二区三区综合网 | 黄色大片免费看 | 黄色一级片在线观看 | 国产黄色网页 | 免费视频a | 亚洲电影在线播放 | 成人做爰s片免费看网站 | 成人做爽爽爽爽免费国产软件 | 午夜免费一区 | 91丨九色丨国产在线观看 | 91精品国产91久久久久久蜜臀 | 大西瓜永久免费av在线 | 国产自在自线午夜精品视频在 | 日韩欧美中文字幕视频 | 亚洲精品xxx | 国产精品视频一区二区三区四 | 免费毛片观看 | 成人福利视频在线观看 | 羞羞视频免费网站日本动漫 | 成人福利视频导航 | 欧美成人国产va精品日本一级 | 午夜久 | 久久久久久久久浪潮精品 | 爱福利视频网 | 中文字幕在线永久视频 | 国产91一区二区三区 | 女教师~淫辱の动漫在线 | 欧美性受xxx黑人xyx性爽 | 成码无人av片在线观看网站 | 国产91对白叫床清晰播放 | 99精品视频99 | 一区二区三区四区高清视频 | 成品片a免人视频 |