Scala學習(一),Scala學習(
1. Scala變數
a. 變數,使用關鍵字 "var"。常量使用關鍵字"val"
b. 變數型別宣告:
var VariableName : DataType [= Initial Value]
或
val VariableName : DataType [= Initial Value]
2. Scala 存取修飾詞
private:帶有此標記修飾的成員僅在包含了成員定義的類或對象內部可見,同樣的規則還適用於內部類。
class Outer{ class Inner{ private def f(){println("f")} class InnerMost{ f() // 正確 } } (new Inner).f() //錯誤}
protected:比Java要嚴格一些,只允許在定義了該成員的類的子類中被訪問。
3. Scala 函數
Scala 函數定義格式如下:
def functionName ([參數列表]) : [return type] = { function body return [expr]}
函數式變成是scala語言的核心,主要分為函數傳名調用、指定函數參數名、函數-可變參數、遞迴函式、預設參數值、高階函數、內嵌函數、匿名函數、偏應用函數、函數柯裡化
3.1 函數傳名調用
函數的形參從 paraName:Type 變成 paraName: =>Type,表示在傳入改參數時不計算,在正真調用的時候再計算。結果表明,fun3在調用前會先去計算fun1的值。
object ScalaApp { def fun1():Long = { println("fun1") return System.currentTimeMillis(); } def fun2(t: =>Long )={ //函數傳名調用 println("fun2") println(t) } def fun3(t:Long)={ //函數傳值調用 println("fun3") println(t) } def main(args: Array[String]): Unit = { fun2(fun1) println("--------------") fun3(fun1) }}
輸出結果:
fun2
fun1
1490334605854
--------------
fun1
fun3
1490334605854
3.2 指定參數名
object Test { def main(args: Array[String]) { printInt(b=5, a=7); } def printInt( a:Int, b:Int ) = { println("Value of a : " + a ); println("Value of b : " + b ); }}3.3 可變參數
Scala 通過在參數的類型之後放一個星號(*)來設定可變參數(可重複的參數)
3.4 閉包
閉包是一個函數,傳回值依賴於聲明在函數外部的一個或多個變數。
如一個匿名函數:val bifun = (t:Long) => t*10,下面函bifun就是一個閉包,可以通過訪問函數外面的變數。
var param = 10val bifun = (t:Long) => t*param
4. 基本類型和操作4.1 對象相等
== 不僅僅對基本類型有效,對列表也有效
List(1,2,3) == List(1,2,3)
5. 類和對象5.1 從構造器
有些時候一個類需要多個構造器,Scala裡主構造器之外的構造器被稱為從構造器
class A(para_a:Int,para_b:AnyVal) { private val a = para_a; def this()=this(0,0) //從構造器 def fun():Int = { return 1 }}5.2 定義操作符
class A{ def + (a:Int): Unit ={ }}6. 使用try處理異常
def fun() ={ try{ throw new NullPointerException("") }catch{ case ex:NullPointerException => ex.printStackTrace() case ex:Exception => ex.printStackTrace() } }
關於finally,在Java裡,如果finally子句中包含一個顯式返回語句,或拋出一個異常,那麼這個傳回值會淩駕於之前try代碼塊或catch子句產生的Exception之上。如:
def f():Int = try{return 1}finally{return 2} //調用f()產生的結果值是2。相反:
def g():Int = try{1}finally{2} //調用g()產生的結果值是1
所以,還是盡量避免在finally中包含傳回值。
7. match運算式
val str = "ab" str match { case "a" => println("is a") case "b" => println("is b") }8. 柯裡化(Curry)
def sum(x:Int, y:Int) = x + y
def curriedSum(x:Int)(y:Int) = x + y //柯裡函數
>: curriedSum(1)(2)
這裡你調用柯裡函數curriedSum,你實際上調用了兩個傳統函數。第一個函數調用帶單個名為x的Int參數,並返回第二個函數的函數值。第二個函數帶Int參數y。下面名為first的函數實質上執行了curriedSum函數的第一個傳統函數會做的事情:
def first(x:Int) = (y:Int) => x+y //curriedSum的第一個函數返回的是一個函數