2、函数入门
一、函數(shù)入門
1、定義函數(shù)
在Scala中定義函數(shù)時(shí),需要定義函數(shù)的函數(shù)名、參數(shù)、函數(shù)體。我們的第一個(gè)函數(shù)如下所示:def sayHello(name:String,age:Int)= {if(age>18){printf("hi %s,you are a big boy\n",name); age}else{printf("hi %s,you are a little boy\n",name);age}Scala要求必須給出所有參數(shù)的類型,但是不一定給出函數(shù)返回值的類型,只要右側(cè)的函數(shù)體中不包含遞歸的語句,Scala就可以自己根據(jù)右側(cè)的表達(dá)式推斷出返回類型。######### scala> :paste // Entering paste mode (ctrl-D to finish)def sayHello(name:String, age:Int) = {if(age >= 18) {printf("Hi, %s, you are a big boy!\n", name)age} else {printf("Hi, %s, you are a little boy!\n", name)age} }// Exiting paste mode, now interpreting.sayHello: (name: String, age: Int)Intscala> sayHello("leo", 30) Hi, leo, you are a big boy! res40: Int = 302、在代碼塊中定義函數(shù)
單行的函數(shù):def sayHello(name:String)= print("Hello,"+name)如果函數(shù)體中有多行代碼,則可以使用代碼塊的方式包裹多行代碼,代碼塊中最后一行的返回值就是整個(gè)函數(shù)的返回值。 與Java中不同,不是使用return返回值的。比如如下的函數(shù),實(shí)現(xiàn)累加的功能: def sum(n:Int)= {var sum=0;for(i<- 1 to n)sum+=i sum }###### scala> :paste // Entering paste mode (ctrl-D to finish)def sum(n:Int) = { #寫=時(shí),函數(shù)要有返回值var result =0 for(i <- 1 to n) {result += i}result }// Exiting paste mode, now interpreting.sum: (n: Int)Intscala> sum(10) res41: Int = 553、遞歸函數(shù)
如果在函數(shù)體內(nèi)遞歸調(diào)用函數(shù)自身,則必須手動(dòng)給出函數(shù)的返回類型。例如,實(shí)現(xiàn)經(jīng)典的斐波那契數(shù)列: def fab(n:Int): Int = { #第二個(gè)Int是返回類型 if(n <= 1)1 else fab(n-1)+ fab(n-2) }二、默認(rèn)參數(shù)和帶名參數(shù)
1、默認(rèn)參數(shù)
在Scala中,有時(shí)我們調(diào)用某些函數(shù)時(shí),不希望給出參數(shù)的具體值,而希望使用參數(shù)自身默認(rèn)的值,此時(shí)就定義在定義函數(shù)時(shí)使用默認(rèn)參數(shù)。def sayHello(firstName:String,middleName:String="William", lastName:String="Croft")= firstName + " " + middleName +" " + lastName如果給出的參數(shù)不夠,則會(huì)從作往右依次應(yīng)用參數(shù)。#### scala> :paste // Entering paste mode (ctrl-D to finish)def sayHello(name: String, age: Int = 20) {print("Hello, " + name + ", you age is " + age) }// Exiting paste mode, now interpreting.sayHello: (name: String, age: Int)Unitscala> sayHello("leo") Hello, leo, you age is 20 scala> sayHello("leo",30) Hello, leo, you age is 302、帶名參數(shù)
在調(diào)用函數(shù)時(shí),也可以不按照函數(shù)定義的參數(shù)順序來傳遞參數(shù),而是使用帶名參數(shù)的方式來傳遞。sayHello(firstName="Mick",lastName ="Nina",middleName="Jack")還可以混合使用未命名參數(shù)和帶名參數(shù),但是未命名參數(shù)必須排在帶名參數(shù)前面。sayHello("Mick",lastName="Nina",middleName ="Jack")#####三、變長參數(shù)
1、變長參數(shù)
在Scala中,有時(shí)我們需要將函數(shù)定義為參數(shù)個(gè)數(shù)可變的形式,則此時(shí)可以使用變長參數(shù)定義函數(shù)。 def sum(nums:Int*)= {var res = 0for(num <- nums)res += numres }####### scala> :paste // Entering paste mode (ctrl-D to finish)def sum(nums: Int*) = {var result = 0for(num <- nums) {result += num}result }// Exiting paste mode, now interpreting.sum: (nums: Int*)Intscala> sum(1,2,3,4,5) res44: Int = 152、使用序列調(diào)用變長參數(shù)
在如果想要將一個(gè)已有的序列直接調(diào)用變長參數(shù)函數(shù),是不對(duì)的。比如val s=sum(1 to 5)。 此時(shí)需要使用Scala特殊的語法將參數(shù)定義為序列,讓Scala解釋器能夠識(shí)別。這種語法非常有用!一定要好好主意,在spark的源碼中大量地使用到了。val s = sum(1 to 5:_*)案例:使用遞歸函數(shù)實(shí)現(xiàn)累加def sum2(nums:Int*):Int = {if(nums.length==0)0else nums.head + sum2(nums.tail:_*) }######## scala> :paste // Entering paste mode (ctrl-D to finish)def sum(nums: Int*) = {var result = 0for(num <- nums) {result += num}result }// Exiting paste mode, now interpreting.sum: (nums: Int*)Intscala> sum(1 to 5: _*) res45: Int = 15## scala> :paste // Entering paste mode (ctrl-D to finish)def sum2(nums: Int*): Int = {if(nums.length == 0) 0else nums.head + sum2(nums.tail: _*) }// Exiting paste mode, now interpreting.sum2: (nums: Int*)Intscala> sum2(1,2,3,4,5) res46: Int = 15四、過程、lazy值和異常
1、過程
在Scala中,定義函數(shù)時(shí),如果函數(shù)體直接包裹在了花括號(hào)里面,而沒有使用=連接,則函數(shù)的返回值類型就是Unit。這樣的函數(shù)就被稱之為過程。 過程通常用于不需要返回值的函數(shù)。過程還有一種寫法,就是將函數(shù)的返回值類型定義為Unit。def sayHello(name:String)="Hello,"+name def sayHello(name:String){print("Hello,"+name);"Hello,"+name} def sayHello(name:String):Unit="Hello,"+name###### scala> def sayHello(name: String) {print("hello, " + name); "Hello, " + name} sayHello: (name: String)Unitscala> sayHello("leo") hello, leoscala> def sayHello(name: String) = {print("hello, " + name); "Hello, " + name} sayHello: (name: String)Stringscala> sayHello("leo") hello, leores48: String = Hello, leoscala> def sayHello(name: String): Unit = "Hello, " + name sayHello: (name: String)Unitscala> sayHello("leo")scala>2、lazy值
在Scala中,提供了lazy值的特性,也就是說,如果將一個(gè)變量聲明為lazy,則只有在第一次使用該變量時(shí),變量對(duì)應(yīng)的表達(dá)式才會(huì)發(fā)生計(jì)算。 這種特性對(duì)于特別耗時(shí)的計(jì)算操作特別有用,比如打開文件進(jìn)行l(wèi)O,進(jìn)行網(wǎng)絡(luò)lO等。import scala.io.Source._ lazy val lines=fromFile("C:/Users/Administrator/Desktop/test.txt").mkString即使文件不存在,也不會(huì)報(bào)錯(cuò),只有第一個(gè)使用變量時(shí)會(huì)報(bào)錯(cuò),證明了表達(dá)式計(jì)算的lazy特性。val lines=fromFile("C://Users//Administrator/Desktop/test.txt").mkString lazy val lines=fromFile("C://Users/Administrator//Desktop/test.txt").mkString def lines = fromFile("C://Users/Administrator/Desktop/test. txt"). mkString####### scala> lazy val lines = fromFile("//home//test.txt").mkString lines: String = <lazy>scala> print(lines) Hello Word3、異常
在Scala中,異常處理和捕獲機(jī)制與Java是非常相似的。try{throw new lllegalArgumentException("x should not be negative") }catch{case _:lllegalArgumentException => printin("lllegal Argument!") }finally{print("release resources!")#############轉(zhuǎn)載于:https://www.cnblogs.com/weiyiming007/p/10954018.html
總結(jié)
- 上一篇: Oracle基于布尔的盲注总结
- 下一篇: 软件测试第七次作业