函數的同義異名問題——演示各類函數式語言中的用法
作為函數式編程語言的共同特征,在每一種語言里都可以找到同樣的幾大類基本函數。
不過繼承函數式傳統的語言喜歡按照范式術語來命名基本函數,而出自腳本語言背景的則更喜歡使用描述性的名字(有時候還會起多個名字,實質是指向相同函數的別名)。
函數的同義異名問題——演示各類函數式語言中的用法——篩選
篩選函數將用戶(以高階函數的形式)給定的布爾邏輯作用于集合,返回由原集合中符合條件的元素組成的一個子集。篩選操作與查找(find)函數的關系很密切,查找函數返回的是集合中第一個符合條件的元素。
函數的同義異名問題——演示各類函數式語言中的用法——篩選——Scala——filter
利用Scala的隱式參數(implicit parrameter)特性可以讓例子變得更簡短:
filter()可以用于任意的集合。
函數的同義異名問題——演示各類函數式語言中的用法——篩選——Scala——partition
返回結果是由原集合的內容劃分而成的兩個集合,原集合本身保持不變。劃分的依據是用戶傳進來作為篩選條件的高階函數。
函數的同義異名問題——演示各類函數式語言中的用法——篩選——Scala——find
filter()函數返回所有匹配元素的集合,而find()只返回第一個匹配項:
find()并不直接把匹配項作為返回值,而是用Option類作了一層包裝。Option有兩個可能的取值:Some或者None。
函數的同義異名問題——演示各類函數式語言中的用法——篩選——Scala——takeWhile()
根據一個傳入的斷言來決定元素去留的。
takeWhile()函數從集合頭部開始,一直取到第一個不滿足斷言的元素:
函數的同義異名問題——演示各類函數式語言中的用法——篩選——Scala——dropWhile()函數
從集合頭部開始,一直丟棄滿足斷言的元素,直到遇到第一個非匹配項:
函數的同義異名問題——演示各類函數式語言中的用法——篩選——Groovy——findAll()函數
Groovy一般不被看作一種函數式語言,但它具備很多函數式的范式,只是命名上往往帶有腳本語言的色彩。
按照函數式語言的傳統一般叫作filter()的函數,對應的是Groovy的findAll()方法:
這個方法也像Scala的篩選函數一樣,適用于所有的類型,包括字符串:
函數的同義異名問題——演示各類函數式語言中的用法——篩選——Groovy——split()函數
Groovy也有跟partition()對應的函數,叫作split():
split()方法的返回值是一個嵌套的數組,類似于Scala的partition()函數返回的嵌套列表。
函數的同義異名問題——演示各類函數式語言中的用法——篩選——Groovy——find()函數
Groovy的find()方法返回集合中的第一個匹配項:
當find()找不到匹配項的時候,Groovy沒有采用Scala防范空值的做法,而是按照Java的習慣直接返回null。
函數的同義異名問題——演示各類函數式語言中的用法——篩選——Groovy——takeWhile()函數
函數的同義異名問題——演示各類函數式語言中的用法——篩選——Groovy——dropWhile()函數
和Scala的例子一樣,Groovy的dropWhile()也是作為一種特殊的篩選來使用的。它丟棄滿足斷言的最長前綴,換言之,被篩選到的只是列表開頭的一部分:
函數的同義異名問題——演示各類函數式語言中的用法——篩選——Clojure——(filter )函數
Clojure用于操縱集合的招式數量多得驚人,而且Clojure語言的動態類型特征,這些函數一般還都是泛型的函數。
Clojure在命名上沿襲函數式編程的傳統。
Clojure和另外兩種語言一樣,提供了針對簡單匿名函數的簡寫語法:
Clojure的函數也像另外兩種語言一樣,適用于各種類型,包括字符串:
Clojure給(filter )設定的返回值類型是Seq。Seq接口是Clojure用于表示序列型集合的核心抽象,用一對圓括號括起來的就是一個Seq。
Java程序員學習交流群481495939,既有技術大佬,又有老司機開車,各位對Java感興趣的可以來交流學習一下,快樂與技術一起進步。