這篇文章我們大概過一下Scala的基礎概念,後面的文章我們會有更詳細的講解Scala的具體內容。
常量
在Scala中常量用val關鍵字表示,如下所示:
<code>val
x
=
1
+
1
println(x)
//
2
/<code>
常量只能賦值一次,不能被多次賦值:
<code>x
=3
// This does not compile. /<code>
在上面的例子中,x 的類型是根據後面的類型推算出來的,當然你也可以顯示指定x的類型,如下所示:
<code>val x:
Int
=
1
+
1
/<code>
變量
變量和常量相比可以重新賦值,變量可以用var來定義。
<code>var
x =1
+1
x =3
println
(x * x) /<code>
同樣的,你可以顯示指定變量的類型:
<code>var x:
Int
=
1
+
1
/<code>
代碼塊
在scala中,代碼塊用{}表示,在代碼塊中最後一個表達式的結果就是整個塊的結果,可以作為返回值來使用。
<code>println({
val
x
=
1
+
1
x
+
1
})
//
3
/<code>
函數
Scala的函數和java中的lambda表達式類似,它是一個帶有參數的表達式。你可以定義匿名函數或者命名函數,如下所示:
<code>(x:Int
) => x +1
/<code>
<code>val addOne =(x: Int)
=> x +1
println(addOne(1
))//
2
/<code>
函數還可以帶多個參數:
<code>val
add = (x:Int
, y:Int
) => x + y println(add(1
,2
)) /<code>
或者不帶參數:
<code>val getTheAnswer =()
=>42
println(getTheAnswer())//
42
/<code>
方法
方法跟函數很類似,不同的是方法由def關鍵字來定義,def後面跟著一個名字、參數列表、返回類型和方法體。
<code>def add(x:Int
, y:Int
):Int
= x + y println(add(1
,2
)) /<code>
和函數不同的是,scala的方法還可以接受多個參數列表:
<code>def addThenMultiply(x:Int
, y:Int
)(multiplier:Int
):Int
= (x + y) * multiplier println(addThenMultiply(1
,2
)(3
)) /<code>
或者沒有參數列表:
<code>def
name
:String
=System
.getProperty
(
"user.name"
) println("Hello, "
+ name +"!"
) /<code>
如果方法的內容比較多的話,可以使用{}來表示多行。
<code>def getSquareString(input:Double
): String = {val
square = input * input square.toString } println(getSquareString(2.5
)) /<code>
在代碼塊中我們講到,最後一個表達式就是代碼塊的返回值,這裡返回值就是square.toString。 雖然在scala中也有return這個關鍵字,但是我們很少用到。
類
Scala的類用class關鍵字表示,後面跟著類的名字和構造函數:
<code>class
Greeter
(prefix
:String
,suffix
:String
) {def
greet
(
name:
String): Unit = println(prefix + name + suffix) } /<code>
類裡面我們定義了一個方法greet,它的返回值是Unit,可以看成是java中的void。
你可以使用new關鍵詞來創建類的實例:
<code>val greeter =new
Greeter("Hello, "
,"!"
) greeter.greet("Scala developer"
) /<code>
case類
scala中有一種專門用來做比較的類叫做case class:
<code>caseclass
Point
(x:Int
, y:Int
) /<code>
case class可以不用new來實例化:
<code>val
point = Point(1
,2
)val
anotherPoint = Point(1
,2
)val
yetAnotherPoint = Point(2
,2
) /<code>
他們的值可以做比較:
<code>if
(point == anotherPoint) {println
(point +" and "
+ anotherPoint +" are the same."
) }else
{println
(point +" and "
+ anotherPoint +" are different."
) }if
(point == yetAnotherPoint) {println
(point +" and "
+ yetAnotherPoint +" are the same."
) }else
{println
(point +" and "
+ yetAnotherPoint +" are different."
) } /<code>
對象
對象使用object來定義的,對象可以看成是它自己類的單例。
<code>object
IdFactory {private
var
counter =0
def
create
(): Int = { counter +=1
counter } } /<code>
你可以通過引用它的名字來訪問一個對象。
<code>val
newId:Int
= IdFactory.create() println(newId)val
newerId:Int
= IdFactory.create() println(newerId) /<code>
trait
trait是包含某些字段和方法的類型。使用trait關鍵字來定義,它和java的接口很類似:
<code>trait
Greeter
{ def greet(name: String):Unit
} /<code>
trait可以有默認的實現:
<code>trait
Greeter
{ def greet(name: String):Unit
= println("Hello, "
+ name +"!"
) } /<code>
trait可以使用extends來繼承,並使用override來覆蓋默認的實現:
<code>class
DefaultGreeterextends
Greeterclass
CustomizableGreeter(prefix:String
, postfix:String
)extends
Greeter { override def greet(name:String
): Unit = { println(prefix + name + postfix) } } val greeter =new
DefaultGreeter() greeter.greet("Scala developer"
) val customGreeter =new
CustomizableGreeter("How are you, "
,"?"
) customGreeter.greet("Scala developer"
) /<code>
main方法
和java一樣,scala的main方法也是程序運行的入口。Scala 中的 main 方法是 def main(args: Array[String]),而且必須定義在 object 中。如下所示:
<code>object Main {def
main
(args: Array[String])
: Unit = println("Hello, World!"
) } /<code>
除了自己寫main方法以外,還可以繼承App traits,然後將業務邏輯直接寫在構造函數中,同時可以使用args來接收參數。如下所示:
<code>object Test extends App {if
(args.length >0
){println
("hello "
+ args(0
)) }else
{println
("Hello world"
) } } /<code>
歡迎關注我的公眾號:程序那些事,更多精彩等著您!
更多內容請訪問:flydean的博客 flydean.com