Scala教程之:Scala基礎

這篇文章我們大概過一下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>case 

class

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

DefaultGreeter

extends

Greeter

class

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


Scala教程之:Scala基礎


分享到:


相關文章: