函數(shù)的同義異名問題——演示各類函數(shù)式語言中的用法
作為函數(shù)式編程語言的共同特征楚昭,在每一種語言里都可以找到同樣的幾大類基本函數(shù)剂公。
不過繼承函數(shù)式傳統(tǒng)的語言喜歡按照范式術(shù)語來命名基本函數(shù)沫浆,而出自腳本語言背景的則更喜歡使用描述性的名字(有時(shí)候還會(huì)起多個(gè)名字眨攘,實(shí)質(zhì)是指向相同函數(shù)的別名)吮廉。
函數(shù)的同義異名問題——演示各類函數(shù)式語言中的用法——篩選
篩選函數(shù)將用戶(以高階函數(shù)的形式)給定的布爾邏輯作用于集合曲聂,返回由原集合中符合條件的元素組成的一個(gè)子集递惋。篩選操作與查找(find)函數(shù)的關(guān)系很密切柔滔,查找函數(shù)返回的是集合中第一個(gè)符合條件的元素。
函數(shù)的同義異名問題——演示各類函數(shù)式語言中的用法——篩選——Scala——filter
利用Scala的隱式參數(shù)(implicit parrameter)特性可以讓例子變得更簡短:
filter()可以用于任意的集合萍虽。
函數(shù)的同義異名問題——演示各類函數(shù)式語言中的用法——篩選——Scala——partition
返回結(jié)果是由原集合的內(nèi)容劃分而成的兩個(gè)集合睛廊,原集合本身保持不變。劃分的依據(jù)是用戶傳進(jìn)來作為篩選條件的高階函數(shù)杉编。
函數(shù)的同義異名問題——演示各類函數(shù)式語言中的用法——篩選——Scala——find
filter()函數(shù)返回所有匹配元素的集合超全,而find()只返回第一個(gè)匹配項(xiàng):
find()并不直接把匹配項(xiàng)作為返回值咆霜,而是用Option類作了一層包裝。Option有兩個(gè)可能的取值:Some或者None嘶朱。
函數(shù)的同義異名問題——演示各類函數(shù)式語言中的用法——篩選——Scala——takeWhile()
根據(jù)一個(gè)傳入的斷言來決定元素去留的蛾坯。
takeWhile()函數(shù)從集合頭部開始,一直取到第一個(gè)不滿足斷言的元素:
函數(shù)的同義異名問題——演示各類函數(shù)式語言中的用法——篩選——Scala——dropWhile()函數(shù)
從集合頭部開始疏遏,一直丟棄滿足斷言的元素脉课,直到遇到第一個(gè)非匹配項(xiàng):
函數(shù)的同義異名問題——演示各類函數(shù)式語言中的用法——篩選——Groovy——findAll()函數(shù)
Groovy一般不被看作一種函數(shù)式語言,但它具備很多函數(shù)式的范式财异,只是命名上往往帶有腳本語言的色彩倘零。
按照函數(shù)式語言的傳統(tǒng)一般叫作filter()的函數(shù),對(duì)應(yīng)的是Groovy的findAll()方法:
這個(gè)方法也像Scala的篩選函數(shù)一樣宝当,適用于所有的類型视事,包括字符串:
函數(shù)的同義異名問題——演示各類函數(shù)式語言中的用法——篩選——Groovy——split()函數(shù)
Groovy也有跟partition()對(duì)應(yīng)的函數(shù)胆萧,叫作split():
split()方法的返回值是一個(gè)嵌套的數(shù)組庆揩,類似于Scala的partition()函數(shù)返回的嵌套列表。
函數(shù)的同義異名問題——演示各類函數(shù)式語言中的用法——篩選——Groovy——find()函數(shù)
Groovy的find()方法返回集合中的第一個(gè)匹配項(xiàng):
當(dāng)find()找不到匹配項(xiàng)的時(shí)候跌穗,Groovy沒有采用Scala防范空值的做法订晌,而是按照J(rèn)ava的習(xí)慣直接返回null。
函數(shù)的同義異名問題——演示各類函數(shù)式語言中的用法——篩選——Groovy——takeWhile()函數(shù)
函數(shù)的同義異名問題——演示各類函數(shù)式語言中的用法——篩選——Groovy——dropWhile()函數(shù)
和Scala的例子一樣蚌吸,Groovy的dropWhile()也是作為一種特殊的篩選來使用的锈拨。它丟棄滿足斷言的最長前綴,換言之羹唠,被篩選到的只是列表開頭的一部分:
函數(shù)的同義異名問題——演示各類函數(shù)式語言中的用法——篩選——Clojure——(filter )函數(shù)
Clojure用于操縱集合的招式數(shù)量多得驚人奕枢,而且Clojure語言的動(dòng)態(tài)類型特征,這些函數(shù)一般還都是泛型的函數(shù)佩微。
Clojure在命名上沿襲函數(shù)式編程的傳統(tǒng)缝彬。
Clojure和另外兩種語言一樣,提供了針對(duì)簡單匿名函數(shù)的簡寫語法:
Clojure的函數(shù)也像另外兩種語言一樣哺眯,適用于各種類型谷浅,包括字符串:
Clojure給(filter )設(shè)定的返回值類型是Seq。Seq接口是Clojure用于表示序列型集合的核心抽象奶卓,用一對(duì)圓括號(hào)括起來的就是一個(gè)Seq一疯。
Java程序員學(xué)習(xí)交流群481495939,既有技術(shù)大佬夺姑,又有老司機(jī)開車墩邀,各位對(duì)Java感興趣的可以來交流學(xué)習(xí)一下,快樂與技術(shù)一起進(jìn)步盏浙。