前言
上一節對scala的匹配模式,做了乙個大致的介紹。這一節將對scala的高階函式進行乙個入門。作為一門函式式程式語言,想要用好這門語言,scala函式的高階用法還是比較重要的。同樣再介紹相關知識的時候,會和python進行對比。
字串高階操作
格式化字串操作
在python中格式字串的方式比較多,比如format方法。而在scala裡這裡彷彿把他變得更簡潔
s"字串$變數"
前面乙個s宣告這個字串內部有格式化字串的方法,具體用法如下
我們也不難看到,就算用了美元符,字串前如果不用s宣告同樣無法呼叫
多行字串賦值
這點就更python十分類似了,通過三等號賦值
val b =
""" |這是乙個多行字串
|hello
|world
|"""
.stripmargin
類似當然也有區別,區別就是每一行多了乙個豎槓,結尾多了乙個.stripmargin。當然這些也都是scala自動補齊的。
scala 匿名函式
大多數高階語言都有匿名函式的用法,scala也是。scala的匿名函式雖然不像python的lamaba 寫的那麼順滑,用起來同樣是十分流暢的。
匿名函式的寫法
(引數:型別) => 函式體
例如
(x:
int,y:
int)
=> x+y
我們可以把匿名函式賦值給乙個變數
val a =
(x:int
,y:int
)=> x+y
println(a(3,4))
當然同樣我們也能把匿名函式賦值和乙個函式
def b =
(x:int
,y:int
)=> x+y
println(b(3,4))
scala 柯里化(currying)函式
定義起來同樣十分簡單
def concatstring(a:
string
)(b:
string
)= s"$a$b"
println(concatstring(
"小紅")(
"早起"
))
scala 高階函式
這些就非常重要了,這些spark的transformation運算元都能從這些函式中找到影子。
mapmap函式跟python中的map函式用法還是比較相似的,只不過在python中map需要把可迭代物件(列表等)傳進去,在scala中則不需要。scala採取了一種類似呼叫自身的方式來呼叫這些函式。
我們來定義乙個列表
val l = list(1,
2,3,
4,5,
6,7,
8)
現在我們想對列表裡的每乙個元素進行加一操作
我們感覺這種寫法太冗餘了,因為列表裡的元素型別map函式再調之前已經確定,所以我們可以把型別給省略調
l.map(
(x)=>x+
1)
這樣看起來似乎好點,但是看著還是有點不順滑,我們能不能把括號給去掉呢?事實上,當可迭代物件裡沒乙個元素都是單個的,比如我們定義的l裡為1,2,3,4這樣的單個字元,是可以把小括號給去掉的。
l.map(x=>x+
1)
這樣看起來好多了,我們能不能更優雅一點呢。我們可以通過佔位符來進行操作。
filter 函式
scala中的filter函式同樣跟python中的十分類似,是乙個篩選器
比如我們可以取出陣列中的所有偶數,同樣的在scala中也非常支援鏈式程式設計的書寫方式,我嗎可以用map的結果進行filter
take函式
take類似於sql中的limit,取資料集的前n個元素
l.map(_ * +1).filter(_ % 2 == 0).take(2)
reduce函式
這個函式就稍顯複雜了
reduce函式的入口是兩個元素,就是對臨近的倆元素操作但只需要輸出乙個結果。如果我們要對一段陣列進行求和。
l.reduce(
(x,y)
=>x+y)
函式中的x,y就代表任意兩相鄰的元素
同樣也可以進行簡寫
l.reduce(+)
flatten函式
這個是乙個降維函式
假如我們有乙個二維列表
val f = list(list(1,
2),list(3,
4),list(5,
6),list(1,2))
現在我們想把他拼接在一維列表中
我們來試一下三維的列表
val f = list(list(list(1,
2),(list(3,
4)))
,list(list(1,
2),(list(3,
4)))
) f.flatten
f.flatten.flatten
這個時候降維的是二維列表裡,如果想要降維到一維列表,只需要再加乙個flatten簡單的來說,降幾維就用幾個flatten
flatmap 函式
flatmap其實類似於flatten函式和map的函式的結合,簡單來說是先降維後操作
對陣列裡每乙個元素進行遍歷
val f = list(list(1,
2),list(3,
4),list(5,
6))f.flatmap(_.map(_*2)
).foreach(println)
做點事吧
實現乙個詞云
val wordmap = scala.collection.mutable.linkedhashmap[
string
,int](
)val path =
"c:\\users\\adminstor\\desktop\\laugage.txt"
val words = scala.io.source.fromfile(path)
.mkstring
val wo = list(words)
val split_words = wo.flatmap(_.split(
" ")
).foreach(
word =>
else})
println(wordmap)
Scala高階函式入門
概述高階函式是指使用其他函式作為引數 或者返回乙個函式作為結果的函式。在scala中函式是 一等公民 所以允許定義高階函式。這裡的術語可能有點讓人困惑,我們約定,使用函式值作為引數,或者返回值為函式值的 函式 和 方法 均稱之為 高階函式 1.作為值的函式 在scala中,函式就像其他資料一樣,你可...
Scala12 Scala高階函式
scala混合了物件導向和函式式的特性,我們通常將可以作為引數傳遞到方法中的表示式叫做函式。在函式式程式語言中,函式是 頭等公民 高階函式包含 作為值的函式 匿名函式 閉包 柯里化等等。可以像任何其他資料型別一樣被傳遞和操作的函式。定義函式時格式 val 變數名 輸入引數型別和個數 函式實現和返回值...
Scala高階函式
在scala中,無法直接操縱方法,只能直接操縱函式,所以需要使用 import scala math.val temp ceil val num 3.14 println fun temp num temp的型別是 double double,意為接受double引數並返回double的函式。能夠對...