條件表達(dá)式
語(yǔ)法結(jié)構(gòu): ? if (判斷條件) {邏輯語(yǔ)句} else {邏輯語(yǔ)句}
在scala中, if/else 表達(dá)式有值, 本質(zhì)上就是塊表達(dá)式是有值的;?
val a: Any =if (0 ==0)"a" else 1
=>所有數(shù)據(jù)類(lèi)型的超類(lèi)為 Any 類(lèi)型
val b: Int =if (0 ==0)1 else 2
val c: Unit =if (0 ==0)1
=>為了解決沒(méi)有else的if語(yǔ)句, 在scala中引入 Unit 類(lèi)型,寫(xiě)作 () ;不帶else的 if 語(yǔ)句等同于: if (0=0) 1 else ()
=>() 表示 無(wú)用值 的占位符, 就是 "無(wú)值" 的值;
塊表達(dá)式和賦值
在scala 中, { } 塊包含一系列表達(dá)式, 其結(jié)果也是一個(gè)表達(dá)式; 塊中最后一個(gè)表達(dá)式的值就是塊的值;
val d = { val e =3 }
=>在scala中, val e=3 這個(gè)賦值動(dòng)作本身是沒(méi)有值的, 或者說(shuō)它們的值是Unit類(lèi)型, 所以 d 的值為()
循環(huán)
scala擁有與java相同的 while和do 循環(huán),但是for 循環(huán)做了改變;
for( i <- 集合變量或表達(dá)式 ) { }
=>scala 并沒(méi)有提供break 或 continue 語(yǔ)句來(lái)退出循環(huán),可以使用 boolean類(lèi)型的控制變量, 以及擁有跳出循環(huán)的 return 來(lái)完成 break和continue 的功能;
=>for循環(huán)可以提供多個(gè)循環(huán)變量: for ( i <- 1 to 3; j <- 1 to 5 ){ };
=>for循環(huán)可以提供守衛(wèi): for ( i <- 1 to 3 if i != 2 ) { }
=>yield 關(guān)鍵字: 在循環(huán)體中加上yield關(guān)鍵字,循壞會(huì)創(chuàng)建一個(gè)集合,此集合的類(lèi)型會(huì)根據(jù)要遍歷的集合的類(lèi)型保持一致,每次迭代生成一個(gè)值放入集合;
函數(shù)
個(gè)人認(rèn)為,scala中函數(shù)和方法的區(qū)別就在于 是否是基于對(duì)象的;函數(shù)可以獨(dú)立與對(duì)象單獨(dú)存在,并且函數(shù)還可分為匿名函數(shù)和普通函數(shù),都可以作為變量進(jìn)行傳值; 而方法就必須依附與對(duì)象才能進(jìn)行使用;
def聲明函數(shù)的數(shù)據(jù)類(lèi)型:?
def ?fun_def ( i:String ):String = { "this is def "}
fun_def : ?(i:String)String
?匿名函數(shù)的數(shù)據(jù)類(lèi)型:
val ?no_name = (i:String) => { "this is no name" }
no_name : String => String = <function1>
=>理論上編譯器可以通過(guò)=右側(cè)的表達(dá)式的類(lèi)型推斷出返回值類(lèi)型,可以不寫(xiě),但一定要寫(xiě)上=符號(hào); 如果不寫(xiě)=符號(hào),系統(tǒng)會(huì)認(rèn)為是過(guò)程函數(shù), 默認(rèn)加上的是 :Unit= 空值標(biāo)記,類(lèi)似void;
=>scala中有默認(rèn)參數(shù), def ?a ( i:String, j:String="test"):String={ i+j }
=> lazy val name = xxx ? 懶值并不是非沒(méi)有額外開(kāi)銷(xiāo),我們每次訪問(wèn)懶值時(shí),都會(huì)一個(gè)方法被調(diào)用,而這個(gè)方法將會(huì)以線程安全的方式檢查該值是否被初始化;