scala入門 (五) scala高階函式用法

2021-10-09 15:33:45 字數 4319 閱讀 3933

前言

上一節對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的函式。能夠對...