scala-Unit-3-Scala基礎語法2
一、定義方法、函式、及方法轉換為函式
1.方法的定義:
def 方法名(引數1:資料型別,引數2:資料型別...):返回值型別 ={
}
2.定義函式:
val h1 = (a:Int,b:Int) => {a * b}
3.方法轉換為函式(在Windows下的命令列操作)
def m2(a:Int,b:Int):Int =a + b
m2 _
然後系統生產:res6:(Int,Int) => Int =(function2)
註釋:(function2)表示一個函式,並且有兩個引數、 (Int,Int)代表引數列表
**方法和函式的區別會單獨用一片來整理
二、傳值呼叫&傳名呼叫
什麼是函數語言程式設計? A:方法的引數可以是一個函式的程式設計模型
1.傳值呼叫:方法傳遞的是值,詳情見如下程式碼:
object AntForest { var energy = 1000 def getEnergy():Int={ energy += 50 energy } def getManyEnergy(x: Int):Unit={ for(a <- 1 to 5){ getEnergy() println(s"您現在的能量為:$x") } println(energy) } def main(args: Array[String]): Unit = { getManyEnergy(getEnergy()) } }
解釋:先計算getEnergy的值,將值作為引數放在getManyEnery中使用
輸出結果:
您現在的能量為:1050
您現在的能量為:1050
您現在的能量為:1050
您現在的能量為:1050
您現在的能量為:1050
1300
2.傳名呼叫:將方法作為函式被其他方法呼叫,詳情見如下程式碼:
object AntForest { var energy = 1000 def getEnergy():Int={ energy += 50 energy } def getManyEnergy(x: => Int):Unit={ for(a <- 1 to 5){ getEnergy() println(s"您現在的能量為:$x") } println(energy) } def main(args: Array[String]): Unit = { getManyEnergy(getEnergy()) } }
解釋:將getEnergy作為函式被getManyEnergy呼叫
輸出結果:
您現在的能量為:1100
您現在的能量為:1200
您現在的能量為:1300
您現在的能量為:1400
您現在的能量為:1500
1500
二、可變引數函式與預設引數函式
1.可變引數函式:
Java中可變引數的函式:public static void m1(String...arg){ }
Scala中可變引數函式:def sum(ints:Int*):Unit={ }
object manyPara { def sum(ints:Int*):Int={ var sum = 0 for(v <- ints){ sum += v } sum } def setName(params:Any*):Any={ return params } def main(args: Array[String]): Unit = { println(sum(1,3,5,7,9)) //25 println(setName("Wyh",23,"man")) //WrappedArray(Wyh, 23, man) } }
2.預設引數函式:
如果傳遞了引數,測試用傳遞的值。如果不傳遞引數,測試用預設值
object defaultParam { def sum(a:Int=3,b:Int=7):Int={ a+b } def main(args: Array[String]): Unit = { println(sum()) //10 println(sum(1,5)) //6 } }
三、高階函式
定義:將其他函式作為引數,或其結果是函式的函式
object higherOrderFunction { def getPerson(h:Int => String,f:Int):String={ h(f) } def Person(x:Int):String= "我是" + x.toString + "歲的帥哥" def main(args: Array[String]): Unit = { println(getPerson(Person,18)) } }
解釋:其中getPerson方法的引數為一個函式h、一個變數f,執行體為引數為f的函式h,h(f),
在main方法中getPerson方法將Person方法變為函式,與變數18作為引數,
執行輸出:我是18歲的帥哥
四、字串的格式化輸出
常規輸出方式:val name = "hunter"
var age = 18
println("name:" + name ",age:" + age)
格式化輸出:文字插值器(f、s)
println(f"name = $name,age = $age") println(s"name = $name. age = $age")
println(f"1 + 1 = ${1+1}") println(s"1 + 1 = ${1+1}")
五、部分引數應用函式
如果函式傳遞所有預期的引數,則表示完全應用了它;
如果只傳遞了所有引數當中的幾個,那麼見返回部分應用的函式。
eg.命令列操作:
val sum = (a:Int,b:Int) => a+b
val sum1 = sum(1,_:Int)
println(sum1(4)) //輸出5
程式碼例子如下:
import java.util.Date object PartParam extends App { def log(date:Date,message:String):Unit={ println(s"$date,$message") } val date = new Date() val longMessage = log(date,_:String) log(date,message = "HelloHunter") //Wed Jan 09 18:36:51 CST 2019,HelloHunter longMessage("rebahenmei") //Wed Jan 09 18:36:51 CST 2019,rebahenmei }
解釋:1.使用日期Date要匯入java的util包。
2.App為Scala中的一個特質,可以不寫main方法直接執行程式(如Java中的Test、Before)
六、柯理化
將原來接受的兩個引數的函式變為一個新的接收一個引數的函式的過程叫做柯理化
eg.
def sum(a:Int,b:Int) = a+b
def sum(s:Int)(b:Int) = a+b
這兩個方法是等價的。柯理化可將函式的通用性降低,適用性提高。
通用性:適用於所有或者很多的情況
適用性:適用於一種或幾種的情況
七、偏函式
被包裹在花闊內沒有match的一組case語句,是一個偏函式
PartialFunction[A,B]
A;引數型別 B:返回值型別
偏函式常用於模式匹配
object PartialFunction { def func1(str:String):Int={ if (str.equals("hunter")) 32 else 18 } def func2:PartialFunction[String,Int]={ //使用偏函式必須使用case case "hunter" => 32 case _ => 18 } def main(args: Array[String]): Unit = { println(func1("hunter")) // 32 println(func1("Wyh")) //18 println(func2("hunter")) //32 println(func2("Wyh")) //18 } }
偏函式類似於Java中的swtich/case語句。