scala 11匿名函式 柯里化 閉包

2021-10-08 03:48:14 字數 3883 閱讀 5640

閉包定義乙個沒有名稱的函式,該函式就是匿名函式

示例

/

/定義乙個陣列

scala>

valarray

=array(1

,2,3

,4,5

)array

:array[int] =

array(1

,2,3

,4,5

)//定義乙個沒有名稱的函式---

-匿名函式

scala>

array.map(x=

>x*10)

res1:

array[int] =

array(10

,20,30

,40,50

)

/

/定義乙個陣列

scala>

valarray

=array(1

,2,3

,4,5

)array

:array[int] =

array(1

,2,3

,4,5

)//定義乙個函式

scala>

val func=

(x:int)=

>x*

10func:

int=

>

int=

//函式作為引數傳遞到方法中

scala>

array.map(func)

res0:

array[int] =

array(10

,20,30

,40,50

)

方法可以定義多個引數列表。當使用較少的引數列表呼叫多引數列表的方法時,會產生乙個新的函式。改函式接受剩餘的引數列表作為其引數。這被稱為柯里化

非柯里化寫法:

定義乙個方法getre

/

/getaddress方法引數(a:

string)/

/函式(a:

string):

(string

,string)=

>

string

={} 返回值:

(string

,string)=

>

string

scala>

def getre(a:

string):

(string

,string)=

>

string

=getre:

(a:string)(

string

,string)=

>

string

//定義變數f1接收返回值函式:(

string

,string)=

>

string

//f1型別f1:

(string

,string)=

>

string

=scala>

val f1=getre(

"hadoop"

)f1:

(string

,string)=

>

string

=scala> f1(

"hive"

,"spark"

)res0:

string

= hadoop hive spark

柯里化寫法

/

/上面寫成柯里化形式

//用只有乙個引數的方法去調含有兩個引數的引數列表,會產生乙個新的函式接收被呼叫的的引數列表中的2個引數作為新函式的引數

scala>

def getrec(a:

string

)(b:

string

,c:string):

string

=getrec:

(a:string

)(b:

string

, c:

string

)string

scala> getrec(

"hadoop")(

"hive"

,"spark"

)res6:

string

= hadoop hive spark

//fold函式用到了柯里化

list(1,

2,3,

4).fold(0)

(_+_)

list(1,

2,3,

4).foldleft(0)

(_+_)

list(1,

2,3,

4).foldright(0)

(_+_)

1.把多個引數轉化為單引數函式的級聯,達到了動態確定引數的目的。

2.當某些引數不確定時,可以先保留乙個存根。剩餘的引數確定以後,就可以通過存根呼叫剩下的引數。

3.通過類似於建造者模式(building),把乙個大的東西的構造過程,切成乙個個的小模組來逐步構造。舉個最簡單的例子,person.name(「***」).age(num).salary(count).phone(***x)

scala> var element =

1element:

int=1/

/定義函式f1,它的返回值依賴於不在函式作用域的變數:element

//當外部變數改變時,呼叫f1的返回值結果也不一樣

scala>

val f1 =

(x:int)=

>x*element

f1:int

=>

int=

scala> f1(2)

res7:

int=

2scala> element =

5element:

int=

5scala> f1(2)

res8:

int=

10

在分布式計算中,閉包引用的外部變數可能在不同的伺服器節點上,該變數需要可序列化,來進行網路傳輸

示例2

/

/方法mul的返回值為乙個函式,以該函式的返回值作為返回值

//該函式呼叫mul的引數x和自己的引數進行相乘操作,返回值為乙個double變數

scala>

def mul(x:

double)=

(y:double)=

>x*y

mul:

(x:double

)double

=>

double//

double和tri都儲存了x的引用值

scala>

val doublef=mul(2)

doublef:

double

=>

double

=scala>

val tri=mul(3)

tri:

double

=>

double

=scala> doublef(2)

res9:

double

=4.0

scala> tri(3)

res10:

double

=9.0

Scala 函式柯里化

柯里化指的是將原來接受多個引數的函式變成新的接受乙個引數的函式的過程,新函式的引數接受原來的第二個引數為唯一引數,如果有n個引數,就是把這個函式分解成n個新函式的過程 1 函式程式設計中,接受多個引數的函式都可以轉化為接受單個引數的函式,這個轉化過程就叫柯里化 2 柯里化就是證明了函式只需要乙個引數...

scala 函式柯里化

1 函式程式設計中,接受多個引數的函式都可以轉化為接受單個引數的函式,這個轉化過程就叫柯里化 2 柯里化就是證明了函式只需要乙個引數而已。不重要 package com.xcu.chapter13 object demo05 curry 3 柯里化就是函最重要的是要體現函式的分工協作,例如乙個函式是...

Scala 函式柯里化 Currying

柯里化 currying 指的是將原來接受兩個引數的函式變成新的接受乙個引數的函式的過程。新的函式返回乙個以原有第二個引數為引數的函式。例項 首先我們定義乙個函式 def add x int,y int x y那麼我們應用的時候,應該是這樣用 add 1,2 現在我們把這個函式變一下形 def ad...