1. 程式人生 > >Scala 之 高階函式

Scala 之 高階函式

函數語言程式設計

Scala函數語言程式設計是scala的重中之重,老師多次強調它的重要性,spark當中的計算都是用scala函數語言程式設計來做,高階函式也是其獨特的一個特性,並且spark基於集合,這樣可以使scala發揮其對於集合計算的強大功能。首先,函式/變數同是一等公民,函式與變數同等地位,函式的定義可以單獨定義,可以不依賴於類、介面或者object,而且獨立存在,獨立使用,並且可以賦值給變數。

如:      


這裡我們定義了一個函式fun1,然後將他賦值給力一個變數,格式為

       val變數名 = 函式名+空格+_

這裡函式名後面必須要有空格,表明是函式的原型。

這樣,這個變數就是函數了,如上如,fun_v會接收一個String型別的引數,對引數作用會返回unit型別的返回值(=>表示對左邊的引數進行右邊的加工)。

匿名函式

而在大量的spark中大都用的是匿名函式(不為函式命名),然後將其複製個一個變數。

如:

匿名函式格式:

Val 變數名 = (引數:型別) => 函式體

高階函式

高階函式是函式的引數也是函式。(因為函式的引數可以是變數,而函式又可以賦值給變數,即函式和變數地位一樣,所以函式引數也可以是函式)

如:

首先我們定義了一個函式BigData,這個函式有兩個引數,第一個引數是一個函式,函式名是func,他有一個String型別的引數並且返回值是unit空的;第二個引數是String型別的變數名為content的變數,函式體是將第二個引數作為第一個引數也就是函式func的引數,來呼叫第一個函式,整個函式返回值為unit空。這裡只要傳入的函式的格式與定義的一致就行。

又如:

Array.map()作用,他會遍歷array中每一個元素,並將每個元素作為具體的值傳給map中的作為引數的函式。

高階函式的返回值是函式(更為重要)。

首先,我們定義一個函式作為返回值的一個函式,func_Returned返回的是一個字串型別的。

我們輸入func_Returned(“Spark”),生成了一個名為Spark的函式。


首先我們定義了一個返回值為函式的函式func_Returned,然後我們將其返回值也就是一個函式賦值了變數returned,這樣就得到了一個名為returned的函式,然後我們呼叫returned函式得到了列印結果。

高階函式有個非常有用的特性是型別推斷。其可以自動推斷出引數的型別,而且對於只有一個的引數的函式,可以省略掉小括號,並且在函式的引數作用的函式體內只是用一次函式的輸入引數的值話,就可省略掉函式名,用下劃線(_)代替。

最原始的方法 :

由於scala可以型別推斷,而且func只有一個引數,由於在spark定義是一定義了變數型別,所以我們就可以把name後的型別String去掉,

由於只有一個引數故小括號也可以去掉,

有由於只有一個引數,所以其引數可以省略,用下劃線代替

例如:

函式的閉包

函式的閉包就是當函式的引數超出其作用域時,我們還能對引數進行訪問。例如:

在這裡我們首先定義了返回值為函式的一個函式,然後我們呼叫了該函式,傳入的引數為Spark,通常當函式scala執行結束後,我們是不能在訪問該引數了,因為區域性變數Spark的作用域也就是生命週期結束了,但是當我們呼叫funcResult函式後,發現它是能訪問引數Spark的。這就是函式的閉包。scala內部是建立了一個函式的內部物件,將引數Spark作為一個成員保留在了這個物件中。

科裡化:將一個函式的兩個引數,我們可以把它轉換成兩個函式,第一個函式會接收原函式的第一個引數,第二個的函式會接收原函式的第二個引數作為輸入變數的函式。

例如:


其利用了閉包。

scala高階操作

reduceLeft:他會從(1 to 100)中最左邊的數(也就是1)開始,進行reduce操作,具體操作,先對第一元素與第二元素進行處理,並將結果作為第一個元素與第三個元素進行處理,然後在結果與第四個元素進行處理,一直到最後一個元素。

在這裡“Thecontent is :” + _是一個函式。

例如:單詞拆分


List.zip操作


------------------------------------------EOF--------------------------------------------------------------------------



說明:筆記來源DT大資料IMF課程。


相關推薦

Scala 高階函式

函數語言程式設計 Scala函數語言程式設計是scala的重中之重,老師多次強調它的重要性,spark當中的計算都是用scala函數語言程式設計來做,高階函式也是其獨特的一個特性,並且spark基於集合,這樣可以使scala發揮其對於集合計算的強大功能。首先,函式/變數同是

Scala高階函式

高階函式:把函式傳給函式 第一個高階函式: def formatResult(name:String,n:Int,f:Int=>Int)={ val msg="The %s of %d is %d." msg.format(name,n

Scala練習高階函式

編寫函式values(fun:(Int)=>Int,low:Int,high:Int),該函式輸出一個集合,對應給定區間內給定函式的輸入和輸出。比如,values(x=>x*x,-5,5)應該產出一個對偶的集合(-5,25),(-4,16),(-3

每天學一點Scala 高階函數 map

scala 高階函數 map 要清楚,map函數的本質是?或者說map函數到底是用來幹什麽的?可以參考下面的例子:marathon源碼,spark源碼中大量使用了高階函數map,如下面是marathon的源碼本文出自 “XEJ分布式工作室” 博客,請務必保留此出處http://xingej.blo

函式高階函式

1:函式可以賦值給一個變數名字 ,函式引數能接收變數 這個函式也可以接收另一個函式的函式名作為引數,那麼這就是一個高階函式ef func1(): print('老王好帥!')def func2(ff): ff() return '老王媳婦好美!'print(func2(func1))2:一個函式可以接收

kotlin高階函式

高階函式是一種特殊的函式,它接受函式作為引數,或者返回一個函式 import java.awt.geom.Area fun main(arg: Array<String>) { val mobilePhoto = mobilePhoto() processProd

Python學習筆記 -- 函數語言程式設計高階函式

函數語言程式設計 函數語言程式設計(Functional Programming),是一種抽象程度很高的程式設計正規化,純粹的函數語言程式設計語言編寫的函式沒有變數。因此,任意一個函式,只要輸入是確定的,輸出就是確定的。 函數語言程式設計是一種"程式設計正規化"(pro

Kotlin程式設計高階函式,Lambda表示式,匿名函式

Kotlin程式設計相關知識點介紹: 高階函式 A higher-order function is a function that takes functions as parameters, or returns a function

js高階技巧總結高階函式和防篡改物件

高階函式 1.安全的型別檢測         談到型別檢測,可能大家首先想到的就是typeof 或者 instanceof (檢測陣列Array.isArray(arr))等這些方式,但是這些方法都有自己的侷限性,比如說Safari(直至第四版)對正則使用typeof

Scala高階函式使用總結

    函式在Scala語言中有著舉足輕重的地位,它和類,變數同樣屬於一等公民的地位,函式可以脫離類而獨立存在,同時自己也可以作為引數傳遞給其他函式。    匿名函式scala> val sayHello = (name: String) => println("

JavaScript進階高階函式

JavaScript進階之高階函式篇    簡介:歡迎大家來到woo爺說前端;今天給你們帶來的是JavaScript進階的知識,接下來的系列都是圍繞著JavaScript進階進行闡述;首先我們第一篇講的是高階函式。   高階函式定義:高階函式是指操作函式的函式;一般情況在專案開發過程中都會分兩種情況    

大資料scala(三) --- 類的檢查、轉換、繼承,檔案,特質trait,操作符,apply,update,unapply,高階函式,柯里化,控制抽象,集合

一、類的檢查和轉換 -------------------------------------------------------- 1.類的檢查 isInstanceOf -- 包括子類 if( p.isInstanceOf[Employee]) {

scala-基礎集合和高階函式-07

做spark開發 會使用很多spark的高階函式 所以就在linux服務上使用scala高階函式,叢集又82個節點,我取node40-37為搭建的hadoop叢集,node40是主節點,node39-37是datanode。 ssh node40切換到node40後;輸入s

Scala語言高階函數(4)

ron 個數 處理 組合 元素 二維 spa toolbar 理解 ==> 常用函數講解 ---> map 作用於列表中的每一個元素// 定義一個列表 val list= List(1,2,3,4,5,6,7,8,9) // list 列表

python裡的高階函式(類)reduce

reduce:摺疊 python2:內建函式---直接呼叫 python3:functools模組下     將序列中的每個元素進行計算,計算規則:     先將序列的前兩個值傳遞個函式的引數,並進行計算,將函式計算出來的結果和下一個元

python裡的高階函式(類)map

map---對映, 將每一個元素的引數,進行計算,直到每個元素都運算完畢,返回新的序列(map 物件) 1. map(func, *iterables)         func:函式物件     &nbs

python裡的高階函式(類)filter

filter:過濾 python2中:內建函式 python3中:filter---類 1. filter(function or None, iterable)         過濾掉iterable中為False的所有元素(留下

Python小白學習路(十四)—【作用域】【匿名函式】【程式設計方法論】【高階函式

    吧啦吧啦內心戲 在沒有具體學作用域之前,我在之前的學習筆記中就有提到 我開始以為是自己自創的詞兒 沒想到這個詞早已經存在(手動捂臉) 真是個無知的小火鍋(不知者無罪) 我發現自己最擅長做的事情,就是給自己找個臺階,然後很快順勢滑下來 一、作用域 先來一段程式碼分析一波吧

66 Oracle資料庫SQL開發 高階查詢——使用線性迴歸函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

numpy高階函式操作——select、choose

一、什麼是np.select() 顧名思義,這個函式用用來“ 根據某一些條件 ” 來篩選出 “某一些元素 ”的函式,比如我有一個數組,我如果用if-else語句去做,當然也可以,比如我們讓小於6的元素各自加上10,大於等於6的元素統統變為100,我們可以這麼做,程式碼如下: a=np.a