Scala學習 基礎語法

2022-05-17 19:05:44 字數 4090 閱讀 4585

一、變數

1、

三種變數修飾符

val 定義 immutable variable(不修改 常量)

var定義 immutable variable(可修改 變數)

lazy val (惰性賦值的常量):不直接算出結果,在系統第一次呼叫 lazy val 的時候計算結果

scala> val d = 12

d: int = 12

scala> val e = 20

e: int = 20

scala> lazy val f = d * e

f: int = scala> f*12

res41: int = 2880

scala> f

res42: int = 240

* 可以不顯示指定變數的型別,因為scala會自動進行類別指導

scala> val y:int = 20

y: int = 20

scala> val x = "asd"

x: string = asd

2、函式與**塊**塊(block)**塊用於組織多個表示式,**塊自身也是個表示式,求得的值是最後乙個表示式的值。

**塊有兩種寫法:

1、表示式都寫在一行,表示式之間分號分割

2、表示式分行,表示式末尾不需要分毫

函式

def functionname(param: paramtype):returntype =
示例**如下:

3、if、for表示式

在scala裡面,if和for並不是語句,而是乙個表示式。 語句是可以單獨執行的、能夠產生實際效果的**;而表示式則是包含在語句中,根據某種條件計算出乙個值或得出某種結果,然後由語句去判斷和處理的**。

(1)if表示式

if(logical_exp) vala else valb

scala> if(true) 1 else 2

res44: int = 1

scala> if(false) 3 else 4

res45: int = 4

scala> val a = 1

a: int = 1

scala> if(a == 1) a

res46: anyval = 1

scala> if(a!= 1) a

res47: anyval = ()

scala> if(a!=1) "not one" else a

res48: any = 1

scala> if(a!=1) "not one"

res49: any = ()

if(a!=1) a 的時候返回值是(), 因為「a!=1」是false,且 if 表示式沒有else,所以返回值為scala裡面空是 unit,所以if表示式的返回值就是unit的文字量,就是乙個空括號(2)for comprehension

println("正常的for遍歷:")

for( s

println("\n帶有 filter 的for遍歷:")

for(

s if(s.length>4) // filter

) println("\n帶有 filter 的for遍歷:")

val result_for = for yield (s1) // generator new collection

for( item

for 迴圈中的 yield 會把當前的元素記下來,儲存在集合中,迴圈結束後將返回該集合。scala 中 for 迴圈是有返回值的。如果被迴圈的是 map,返回的就是  map,被迴圈的是 list,返回的就是 list,以此類推。

4、try與match表示式

(1)try表示式

try {}

catch {}

finally {}

示例**:

try  catch  finally
case _ => 0, "_"是萬用字元,無論try中是什麼異常都會被catch到,並返回0。finally 是try{} catch{}之後執行的,無論表示式是否異常,都會執行finally。

(2)match與switch較為相似

exp match
其中的 "case _" 就相當於switch中的 default。

val code = 3

val result_match = code match

5、求值策略scala中有兩種求值策略(evaluation strategy)

1、 call by value - 對傳入引數先進行求值,只一次求值

2、call by name - 函式實參每次在函式體內被呼叫到時都會進行求值

scala 通常使用的時 call by value

如果函式形參型別以 「=>」 開頭,則會使用 call by name

def foo( asd: int)          // call by value

def foo( asd: => int) // call by name

舉個例子:下面定義了test1、test2. test1是call by value; text2是call by name.

def text1(x: int,  y: int): int = x*x

def text2(x: => int, y: => int): int = x*x

例 1 :

test1(3+4, 8)

test1(7, 8) //test1 是call by value,首先會先算出引數

7*749

test2(3+4, 8)

(3+4)*(3+4) // test2是 call by name, 直接把3+4傳入test2,表示式替換x變數

7*(3+4)

7*749

例 2 :

test1(7, 2*4)

test1(7, 8) //test1 是call by value,首先會先算出引數 2*4,再對x、y進行賦值

7*749

test2(7, 2*4) // test2是 call by name, 直接把2*4傳入test2,表示式替換y變數

7*7 // 2*4 沒用到,所以一直不需要進行計算

49

scala基礎語法

一 變數定義 1 val 定義的變數值不可以修改 2 var 定義的變數值可以修改 二 一些變數型別 1 unit 表示不返回任何結果方法的結果型別,相當於void 2 null null 空引用 3 nothing 任何其他類的子型別 4 any 所有其他類的父類 5 anyref 所有引用類的基...

Scala基礎 2 基礎語法

val x 6 if x 0 elsevar i 9 while i 0 val x 0 do while i 5 for 變數 表示式 語句塊 for i 1 to 5 其中 變數 表示式 被稱為 生成器 generator for i 1 to 5 if i 2 0 for i 1 to 5 j...

Scala基礎語法三

1.方法的定義與呼叫 1 方法的定義與呼叫 def 方法名 引數 引數型別,方法返回值型別 當然上邊的方法定義的方式中有許多是可以省略的,例如 省略方法的返回值型別 注意 方法的返回值型別可以不寫,編譯器可以自動推斷出來,但是對於遞迴函式,必須指定返回 省略傳入方法中的引數 注意 如上圖中的例子所示...