中文在线免费看视频_国产成人精品亚洲日本在线观看_亚洲精品第一综合99久久_国产亚洲精品日韩综合网

當前位置: 首頁 / 技術干貨 / 正文
好程序員Java培訓分享Java函數式編碼結構

2020-10-12

Java培訓

  好程序員Java培訓分享Java函數式編碼結構,本文將探討三種下一代JVM語言:GroovyScalaClojure,比較并對比新的功能和范例,讓Java開發人員對自己近期的未來發展有大體的認識,下面我們一起來看一下吧。

好程序員

  當垃圾回收成為主流時,它消除了所有類別的難以調試的問題,使運行時能夠為開發人員管理復雜的、容易出錯的進程。函數式編程旨在為你編寫的算法實現同樣的優化,這樣你就可以從一個更高的抽象層面開展工作,同時運行時執行復雜的優化。

  Java下一代語言并不都占用從命令式到函數式的語言頻譜的同一位置,但都展現出函數功能和習語。函數式編程技術有明確定義,但語言有時為相同的函數式概念使用不同的術語,使得我們很難看到相似之處。在本期文章中,我比較了ScalaGroovyClojure的函數式編碼風格并討論了它們的優勢。

  命令式處理

  我要首先探討一個常見問題及其命令式解決方案。假如給定一個名稱列表,其中一些名稱包含一個字符。系統會要求你在一個逗號分隔的字符串中返回名稱,該字符串中不包含單字母的名稱,每個名稱的首字母都大寫。實現該算法的Java代碼如清單1所示。

  清單1.命令式處理

  public class TheCompanyProcess {

  public String cleanNames(List<String> listOfNames) {

  StringBuilder result = new StringBuilder();

  for(int i = 0; i < listOfNames.size(); i++) {

  if (listOfNames.get(i).length() > 1) {

  result.append(capitalizeString(listOfNames.get(i))).append(",");

  }

  }

  return result.substring(0, result.length() - 1).toString();

  }

  public String capitalizeString(String s) {

  return s.substring(0, 1).toUpperCase() + s.substring(1, s.length());

  }

  }

  由于你必須處理整個列表,解決清單1中問題最簡單的方式是使用一個命令式循環。對于每個名稱,都需要進行檢查,確認其長度是否大于1,然后(如果長度大于1)將首字母大寫的名稱附加到result字符串,并在后面加逗號。最終字符串中的最后一個名稱不應包含逗號,所以我將它從最后返回值中移走。

  在命令式編程中,建議你在較低級上別執行操作。在清單1中的cleanNames()方法中,我執行了三個任務:我篩選列表以消除單字符,將列表中每個名稱的首字母變換為大寫,然后將列表轉化為一個字符串。在命令式語言中,我不得不為三個任務都使用同一低級機制(對列表進行迭代)。函數式語言將篩選、變換和轉化視為常見操作,因此它們提供給你從不同視角解決問題的方式。

  函數式處理

  函數編程語言與命令式語言的問題分類方式不同。篩選、變換和轉化邏輯類別表現為函數。那些函數實現低級變換并依賴于開發人員來編寫作為參數傳遞的函數,進而定制函數的行為。我可以用偽代碼將清單1中的問題概念化為:

  listOfEmps -> filter(x.length > 1) -> transform(x.capitalize) ->

  convert(x, y -> x + "," + y)

  利用函數式語言,你可以建模這一概念性解決方案,無需擔心實現細節。

  Scala實現

  清單2使用Scala實現清單1中的處理示例。它看起來就像是前面的偽代碼,包含必要的實現細節。

  清單2.Scala處理

  val employees = List("neal", "s", "stu", "j", "rich", "bob")

  val result = employees

  .filter(_.length() > 1)

  .map(_.capitalize)

  .reduce(_ + "," + _)

  對于給定的名稱列表,我首先篩選它,剔除長度不大于1的所有名稱。然后將該操作的輸出提供給map()函數,該函數對集合的每個元素執行所提供的代碼塊,返回變換后的集合。最后,來自map()的輸出集合流向reduce()函數,該函數基于代碼塊中提供的規則將每個元素結合起來。

  在本例中,我將每對元素結合起來,用插入的逗號連接它們。我不必考慮三個函數調用中參數的名稱是什么,所以我可以使用方便的Scala快捷方式,也就是說,使用_跳過名稱。reduce()函數從前兩個元素入手,將它們結合成一個元素,成為下一個串接中的diyi個元素。在“瀏覽”列表的同時,reduce()構建了所需的逗號分隔的字符串。

  我首先展示Scala實現是因為我對它的語法比較熟悉,而且Scala分別為篩選、變換和轉化概念使用了行業通用的名稱,即filtermapreduce

  Groovy實現

  Groovy擁有相同的功能,但對它們進行命名的方式與腳本語言(比如Ruby)更加一致。清單1中處理示例的Groovy版本如清單3所示。

  清單3.Groovy處理

  class TheCompanyProcess {

  public static String cleanUpNames(List listOfNames) {

  listOfNames

  .findAll {it.length() > 1}

  .collect {it.capitalize()}

  .join(',')

  }

  }

  盡管清單3在結構上類似于清單2中的Scala示例,但方法名稱不同。GroovyfindAll集合方法應用所提供的代碼塊,保留代碼塊為true的元素。如同ScalaGroovy包含一個隱式參數機制,為單參數代碼塊使用預定義的it隱式參數。collect方法(Groovymap版本)對集合的每個元素執行所提供的代碼塊。Groovy提供一個函數(join()),使用所提供的分隔符將字符串集合串聯為單一字符串,這正是本示例中所需要的。

  Clojure實現

  Clojure是一個使用reducemapfilter函數名的函數式語言,如清單4所示。

  清單4.Clojure處理示例

  (defn process [list-of-emps]

  (reduce str (interpose ","

  (map clojure.string/capitalize

  (filter #(< 1 (count %)) list-of-emps)))))

  Clojurethread-first

  thread-last宏使集合的處理變得更加簡單。類似的Clojurethread-first可簡化與JavaAPI的交互。例如普遍的Java代碼語句person.getInformation().

  getAddress().getPostalCode(),這體現了Java違反迪米特法則的傾向。這種類型的語句給Clojure編程帶來一些煩惱,迫使使用JavaAPI的開發人員不得不構建由內而外的語句,比如(getPostalCode(getAddress(getInformationperson)))thread-first宏消除了這一語法困擾。你可以使用宏將嵌套調用編寫為(->persongetInformationgetAddressgetPostalCode),想嵌套多少層都可以。

  如果你不習慣查看Clojure,可以使用清單4中的代碼,其結構可能不夠清晰。Clojure這樣的Lisp是“由內而外”進行工作的,所以必須從最后的參數值list-of-emps著手。Clojure(filter)函數接受兩個參數:用于進行篩選的函數(本例中為匿名函數)和要篩選的集合。

  你可以為diyi個參數編寫一個正式函數定義,比如(fn[x](<1(countx))),但使用Clojure可以更簡潔地編寫匿名函數。與前面的示例一樣,篩選操作的結果是一個較少的集合。(map)函數將變換函數接受為diyi個參數,將集合(本例中是(filter)操作的返回值)作為第二個參數。Clojure(map)函數的diyi個參數通常是開發人員提供的函數,但接受單一參數的任何函數都有效;內置capitalize函數也符合要求。

  最后,(map)操作的結果成為了(reduce)的集合參數。(reduce)的diyi個參數是組合函數(應用于(interpose)的返回的(str))。(interpose)在集合的每個元素之間(除了最后一個)插入其diyi個參數。

  當函數嵌套過多時,即使最有經驗的開發人員也會倍感頭疼,如清單4中的(process)函數所示。所幸的是,Clojure包含的宏支持你將結構“調整”為更可讀的順序。清單5中的功能與清單4中的功能一樣。

  清單5.使用Clojurethread-last

  (defn process2 [list-of-emps]

  (->> list-of-emps

  (filter #(< 1 (count %)))

  (map clojure.string/capitalize)

  (interpose ",")

  (reduce str)))

  Clojurethread-last宏采取對集合應用各種變換的常見操作并顛倒典型的Lisp的順序,恢復了從左到右的更自然的閱讀方式。在清單5中,首先是(list-of-emps)集合。代碼塊中每個隨后的表單被應用于前一個表單。Lisp的優勢之一在于其語法靈活性:任何時候代碼的可讀性變得很差時,你都可以將代碼調整回具有較高可讀性。

好程序員公眾號

  • · 剖析行業發展趨勢
  • · 匯聚企業項目源碼

好程序員開班動態

More+
  • HTML5大前端 <高端班>

    開班時間:2021-04-12(深圳)

    開班盛況

    開班時間:2021-05-17(北京)

    開班盛況
  • 大數據+人工智能 <高端班>

    開班時間:2021-03-22(杭州)

    開班盛況

    開班時間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發 <高端班>

    開班時間:2021-05-10(北京)

    開班盛況

    開班時間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數據分析 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2020-09-21(上海)

    開班盛況
  • 云計算開發 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2019-07-22(北京)

    開班盛況
IT培訓IT培訓
在線咨詢
IT培訓IT培訓
試聽
IT培訓IT培訓
入學教程
IT培訓IT培訓
立即報名
IT培訓

Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號

中文在线免费看视频_国产成人精品亚洲日本在线观看_亚洲精品第一综合99久久_国产亚洲精品日韩综合网

            成人的网站免费观看| 亚洲va韩国va欧美va精品| 国产a久久麻豆| 中文字幕欧美日韩一区| 91同城在线观看| 国产精品久久久久久久久免费丝袜| 国产美女久久久久| 亚洲欧美日韩国产一区二区三区| 欧美色涩在线第一页| 日韩电影在线看| 中日韩免费视频中文字幕| 色爱区综合激月婷婷| 亚洲mv在线观看| 国产亚洲人成网站| 欧美精品乱码久久久久久按摩| 国产精品美女久久久久高潮| 一本到一区二区三区| 麻豆免费看一区二区三区| 中文字幕免费不卡在线| 欧美色视频一区| 成人免费毛片嘿嘿连载视频| 亚洲综合精品久久| 欧美精品一区二区三区四区| 91在线观看污| 国产成人综合精品三级| 亚洲成人自拍偷拍| 国产精品国产三级国产有无不卡| 精品视频色一区| 一本到三区不卡视频| 国产福利一区二区三区视频在线| 亚洲www啪成人一区二区麻豆| 久久久国产综合精品女国产盗摄| 欧美中文字幕亚洲一区二区va在线| 国精产品一区一区三区mba桃花| 首页国产丝袜综合| 亚洲国产精品自拍| 亚洲激情六月丁香| 亚洲美女屁股眼交3| 亚洲日本va午夜在线影院| 国产日韩欧美一区二区三区乱码 | 久久国产精品99久久人人澡| 亚洲国产成人精品视频| 亚洲综合激情小说| 亚洲特级片在线| 日韩毛片视频在线看| 国产精品电影一区二区| 首页国产欧美久久| 天堂久久久久va久久久久| 国产精品白丝jk黑袜喷水| 色婷婷激情一区二区三区| 久久―日本道色综合久久| 自拍偷自拍亚洲精品播放| 日韩精品一二三| 欧亚洲嫩模精品一区三区| 国产人成一区二区三区影院| 日韩高清欧美激情| 欧美日韩国产a| 色吧成人激情小说| 日韩欧美一二区| 国产精品麻豆欧美日韩ww| 亚洲国产日日夜夜| 国内偷窥港台综合视频在线播放| 丰满亚洲少妇av| 欧美一区二区精品在线| 国产欧美一区二区精品秋霞影院| 亚洲精品国产一区二区精华液 | 日韩免费观看2025年上映的电影 | 自拍视频在线观看一区二区| 亚洲第一成人在线| 不卡的av网站| 国产日韩三级在线| 男人操女人的视频在线观看欧美| 国产高清在线精品| 日韩欧美一级二级三级| 亚洲成人综合在线| 91亚洲精品久久久蜜桃网站| 亚洲精品精品亚洲| 91在线免费播放| 欧美日韩极品在线观看一区| 日本久久一区二区| 欧美在线观看一二区| 91精品国产欧美一区二区成人| 日韩欧美中文一区二区| 久久久亚洲精品石原莉奈| 亚洲视频狠狠干| 国产99一区视频免费| 538prom精品视频线放| 亚洲小说春色综合另类电影| 99精品视频免费在线观看| 国产欧美一区二区在线观看| 国产一区二区不卡在线| 日韩欧美国产电影| 日韩av电影天堂| 欧美一区二区三区成人| 免费在线看一区| 久久精品一区二区三区不卡| 国产美女久久久久| 久久精品欧美一区二区三区不卡 | 国产精品高清亚洲| 99久久精品国产麻豆演员表| 亚洲视频每日更新| 欧美挠脚心视频网站| 美女网站色91| 日本一区二区不卡视频| 色综合久久综合| 亚洲一区av在线| 久久九九久精品国产免费直播| 成人黄动漫网站免费app| 亚洲一区二区三区在线看| 51精品国自产在线| 国产精品一区二区免费不卡| 亚洲精品成人少妇| 日韩欧美一区在线观看| 成人精品免费网站| 日韩国产高清影视| 国产精品丝袜久久久久久app| 欧美日韩亚洲丝袜制服| 国产suv一区二区三区88区| 亚洲午夜激情av| 国产精品久久一卡二卡| 日韩精品一区二区三区在线| 91在线观看高清| 国产99一区视频免费| 日韩成人dvd| 一区二区激情视频| 国产精品久久一级| 久久日韩精品一区二区五区| 欧美日韩高清在线| 日韩欧美视频在线| 91麻豆精品视频| 国产精品1区二区.| 国产福利精品导航| 国产黄色91视频| 国内久久精品视频| 久久精品国产成人一区二区三区| 亚洲综合丝袜美腿| 亚洲天堂2014| 亚洲欧美日韩一区二区| 亚洲精品成人在线| 一区二区三区中文字幕电影 | 国产日韩av一区| 久久免费的精品国产v∧| 欧美电影免费观看完整版| 日韩午夜激情视频| 精品电影一区二区三区| 久久久99久久精品欧美| 国产精品乱人伦| 亚洲一级电影视频| 日韩不卡一区二区三区| 激情久久五月天| 不卡一卡二卡三乱码免费网站| 色综合久久天天| 日韩视频一区二区三区 | 亚洲精品伦理在线| 国精品**一区二区三区在线蜜桃| www.亚洲色图| 日本成人中文字幕在线视频| 成人99免费视频| 久久日韩粉嫩一区二区三区| 性感美女久久精品| 欧美性受xxxx| 一区二区久久久| 色婷婷综合久久久中文字幕| 亚洲国产精品t66y| 精品伊人久久久久7777人| 91精品国产91久久久久久一区二区 | 国产精品美女久久久久久久| 日本不卡的三区四区五区| 色视频一区二区| 亚洲欧美一区二区三区久本道91| 成人白浆超碰人人人人| 中文字幕久久午夜不卡| thepron国产精品| 中文字幕一区二区在线播放| 国产馆精品极品| 久久久久九九视频| 国产精品69久久久久水密桃| 91麻豆精品国产91久久久久久| 亚洲国产精品久久不卡毛片| 91免费视频网| 无吗不卡中文字幕| 精品免费国产二区三区| 国产99精品国产| 久久精品视频一区| 北条麻妃国产九九精品视频| 综合在线观看色| 日韩一区二区不卡| 9久草视频在线视频精品| 亚洲高清免费观看| 欧美电视剧在线观看完整版| 成人激情视频网站| 一区二区在线观看视频在线观看| 欧美精品日韩精品| 成人久久18免费网站麻豆| 亚洲一区中文日韩| 国产日韩欧美亚洲| 欧美变态凌虐bdsm| 欧美日韩的一区二区| 99re66热这里只有精品3直播 | 亚洲日本一区二区|