【快速上手scala】(三)函數入門

目錄

  • 函數定義與調用java

  • 默認參數和帶名參數數組

  • 變長參數微信

  • 過程app

  • lazy和異常機制ide


1、函數的定義和調用 def函數

scala定義函數時,須要用def作修飾,而後指定函數名,參數和函數體,在參數列表和函數體中加上 = 號,以下:學習

scala> :paste
// Entering paste mode (ctrl-D to finish)

def say(name : String,age : Int)={
println("my name is"+name+",my age is"+age)
}

// Exiting paste mode, now interpreting.

say: (name: String, age: Int)Unit

scala> say("xiaoming",18)
my name isxiaoming,my age is18

能夠看出,參數用冒號指定其類型,不一樣參數逗號分隔開,使用時直接調用函數名,指定參數便可spa

scala的函數也能擁有返回值,跟java不一樣,scala並不適用return,而是一條語句的最後一個值就是返回值,提及來拗口,直接上代碼:.net

scala> :paste
// Entering paste mode (ctrl-D to finish)

def sayage(age : Int)={
if(age >= 18){
println("I am a adult "+ age)
age
}else{
println("I am a children "+ age)
age
}
}

// Exiting paste mode, now interpreting.

sayage: (age: Int)Int

scala> sayage(22)
I am a adult 22
res4: Int = 22

在上面的代碼咱們能夠看出,if分支打印輸出以後都有一個單獨一行的age,這就是返回值,scala對於函數的返回值基本均可以自動推斷出來,但在這裏仍是額外說一下,scala是能夠本身指定返回值的,以下:scala

scala> :paste
// Entering paste mode (ctrl-D to finish)

def sayAge(age : Int):Int ={
if(age >= 18){
println("I am a adult "+ age)
age
}else{
println("I am a children "+ age)
age
}
}

// Exiting paste mode, now interpreting.

看出區別了嗎,對,就在def sayAge(age : Int):Int這裏,參數列表後使用冒號加類型的方式指定函數返回值

若是函數體不是多行,也能夠簡化去掉大括號,以下:

scala> def sayHello(name : String) = println("my name is " + name)
sayHello: (name: String)Unit

scala> sayHello("xiaoming")
my name is xiaoming

2、默認參數和帶名參數

有時候咱們但願不給參數具體值,而是使用參數默認值,scala能夠作到這一點

scala> :paste
// Entering paste mode (ctrl-D to finish)

def sayHello(name:String,age:Int = 18)=print("name:"+name+" age:"+age)

// Exiting paste mode, now interpreting.

sayHello: (name: String, age: Int)Unit

scala> sayHello("DaXin")
name:DaXin age:18

如上圖代碼所示,name沒有默認值,必需要手動傳值,age給出默認值18,使用時就能讀取到

scala還支持以不按照函數定義的參數順序來傳遞參數,也就是帶名參數

scala> sayHello(age = 50,name = "Dad")
name:Dad age:50

像這樣把參數顛倒也是能夠正常使用的

3、變長參數
有時候咱們須要函數參數個數可變,這時候能夠使用變長參數

scala> :paste
// Entering paste mode (ctrl-D to finish)

def sum(numbers : Int*) = {
var result = 0;
for(number <- numbers){
result = result+number
}
result
}

// Exiting paste mode, now interpreting.

sum: (numbers: Int*)Int

scala> sum(1,3,5,6)
res2: Int = 15

注意到參數類型Int後面的*號了嗎?這就是變長參數的語法,表明調用時能夠傳入多個Int類型

還有一種狀況,咱們不想寫(1,3,5,6)這樣的參數,而是前面說過的1 to 4這樣的參數,能夠嗎?事實上不行,由於1 to 4本質上是RichInt類型, 而變長參數須要的是多個單Int類型,這時候就須要新的解決辦法:

//:_*告訴編譯器你但願將某個參數看成參數序列處理
scala> sum(1 to 4:_*)
res3: Int = 10

4、過程
過程實際上是個很是簡單的概念,若是一個scala函數的函數名和函數體之間沒有使用等號鏈接,只是用花括號包住了函數體,那他的返回值類型就是Unit,總結一下:過程就是返回值爲Unit,也就是不須要返回值的函數

scala> def say(name: String) { print("Hello, " + name)}
say: (name: String)Unit

scala> say("daXin")
Hello, daXin

5、lazy和異常機制
lazy:把一個變量聲明爲lazy,那麼這個變量只有在真正使用的時候纔會被加載,適用於耗時操做,或者只有觸發某些特殊狀況纔會調用的變量

//定義一個長度爲5的數組
scala> var slist = 1 to 5
slist: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
//已經越界,可是lazy變量不報錯
scala> lazy val e = slist(5)
e: Int = <lazy>
//在使用的時候纔會報錯
scala> e
java.lang.IndexOutOfBoundsException: 5
at scala.collection.immutable.Range.apply$mcII$sp(Range.scala:151)
at scala.collection.immutable.Range.apply(Range.scala:149)
at .e$lzycompute(<console>:15)
at .e(<console>:15)
... 32 elided

//並且lazy只能使用val定義,var會報錯
scala> lazy var num = slist(2)
<console>:1: error: lazy not allowed here. Only vals can be lazy
lazy var num = slist(2)

scala的異常和java很像,咱們來看看

//引入io包,下面會用到IO異常
scala> import java.io._
import java.io._

scala> :paste
// Entering paste mode (ctrl-D to finish)

try{//拋出Illegal異常
throw new IllegalArgumentException("error")
}catch{
//scala的catch沒有(),花括號內是case來判斷不一樣異常,上面拋出Illegal異常,因此IO異常會跳過,在下面被捕獲到
//順便一提拋出的異常若是沒有相應的case能捕獲,就會報錯
case e1:IOException =>print("IO fail")
case e2:IllegalArgumentException =>print("Illegal fail")
}

// Exiting paste mode, now interpreting.

Illegal fail

本文就到此結束啦,原創不易,喜歡的話點個關注唄

本文分享自微信公衆號 - Spark學習指南(smartProgram)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索