Scala入門到精通 第五節 函式與閉包

2021-07-31 08:58:40 字數 3647 閱讀 7858

(一)函式字面量(值函式)

(二)匿名函式

(三)函式的簡化

(四)函式引數

(四)閉包

函式字面量(function literal),也稱值函式(function values),指的是函式可以賦值給變數。

一般函式具有如下形式:

而函式字面量具有如下形式:

/*

函式字面量 function literal=>左側的表示輸入,右側表示轉換操作

*/scala> val increase=(x:int)=>x+1

increase: int=> int = scala> println(increase(10))

11

//前面的語句等同於

scala> def increaseanother(x:int)=x+1

increaseanother: (x: int)int

scala> println(increaseanother(10))11

//多個語句則使用{}

val increase2=(x:int)=>

scala>println(increase2(10))

xuetu

wuyou11

//陣列的map方法中呼叫(寫法1)

scala> println(array(1

,2,3

,4).map(increase).mkstring(","))2

,3,4

,5

//匿名函式寫法(寫法2)

scala>println(array(1,2,3,4).map((x:int)=>x+1).mkstring(","))

2,3,4,5

//花括方式(寫法3)

scala> array(1,2,3,4).map.mkstring(",")

res25: string = 2,3,4,5

//省略.的方式(寫法4)

scala> array(1,2,3,4)

map mkstring(",")

res26: string = 2,3,4,5

//引數型別推斷寫法(寫法5)

scala> array(1,2,3,4)

map mkstring(",")

res27: string = 2,3,4,5

//函式只有乙個引數的話,可以省略()(寫法6)

scala> array(1,2,3,4) map mkstring(",")

res28: string = 2,3,4,5

//如果引數右邊只出現一次,則可以進一步簡化(寫法7)

scala> array(1,2,3,4) map mkstring(",")

res29: string = 2,3,4,5

//值函式簡化方式

//val fun0=1+_,該定義方式不合法,因為無法進行型別推斷

scala> val fun0=1+_

:10: error: missing parameter type for expanded function

((x$1) => 1

x$1))

//值函式簡化方式(正確方式)

scala> val

fun1=1+(_:double)

un1: double => double = scala> fun1(999)

es30: double = 1000.0

//值函式簡化方式(正確方式2)

scala> val fun2:(double)=>double=1+_

fun2: double=> double = scala> fun2(200)

res31: double = 201.0

//函式引數(高階函式)

//((int)=>string)=>string

scala> def convertinttostring(f:(int)=>string)=f

(4)convertinttostring: (f: int => string)

string

scala> convertinttostring

((x:int)=>x+" s")

res32: string = 4 s

//高階函式可以產生新的函式

//(double)=>

((double)=>double)

scala> def

multiplyby

(factor:double)=(x:double)=>factor*x

multiplyby: (factor: double)double=> double

scala> val x=multiplyby(10)

x: double=> double = scala> x(50)

res33: double = 500.0

//閉包(closure)

//(x:int)=>x+more,這裡面的more是乙個自由變數(free variable),more是乙個沒有給定含義的不定變數

//而x則的型別確定、值在函式呼叫的時候被賦值,稱這種變數為繫結變數(bound variable)

scala> (x:int)=>x+more

:8: error: not

found: value more

(x:int)=>x+more

^scala> var more=1

more: int = 1

scala>val fun=(x:int)=>x+more

fun: int=> int = scala> fun(10)

res1: int = 11

scala> more=10

more: int = 10

scala> fun(10)

res2: int = 20

//像這種執行時確定more型別及值的函式稱為閉包,more是個自由變數,在執行時其值和型別得以確定

//這是乙個由開放(free)到封閉的過程,因此稱為閉包

scala> val somenumbers = list(-11, -10, -5, 0, 5, 10)

somenumbers: list[int] = list(-11, -10, -5, 0, 5, 10)

scala> var sum = 0

sum: int = 0

scala> somenumbers.foreach(sum += _)

scala> sum

res8: int = -11

scala> somenumbers.foreach(sum += _)

scala> sum

res10: int = -22

//下列函式也是一種閉包,因為在執行時其值才得以確定

def multiplyby(factor:double)=(x:double)=>factor*x

函式第五節

coding utf 8 1.定義乙個func name 該函式效果如下。assert func lilei lilei assert func hanmeimei hanmeimei assert func hanmeimei hanmeimei def title name if isinsta...

第五節 Scala 基本運算

加法 scala varsum 1 2sum int 3 加法 第二個引數為long 返回值為long scala varsum 1 2lsum long 3 減法 scala 1 2res2 int 1 負數 操作 scala 1 1res3 int 0 乘法 scala 1 2res4 int ...

第五節 字典

字典的表現形式為大括號 dict key必須可hash,必須唯一且必須為不可改變的資料型別 value可存放任意多個值,可修改,可不唯一 無序且查詢速度快 鍵 值 鍵值對 1 dic.keys 返回乙個包含字典所有key的列表 2 dic.values 返回乙個包含字典所有value的列表 3 di...