條件表達(dá)式
語法結(jié)構(gòu): ? if (判斷條件) {邏輯語句} else {邏輯語句}
在scala中, if/else 表達(dá)式有值, 本質(zhì)上就是塊表達(dá)式是有值的;?
val a: Any =if (0 ==0)"a" else 1
=>所有數(shù)據(jù)類型的超類為 Any 類型
val b: Int =if (0 ==0)1 else 2
val c: Unit =if (0 ==0)1
=>為了解決沒有else的if語句, 在scala中引入 Unit 類型,寫作 () ;不帶else的 if 語句等同于: if (0=0) 1 else ()
=>() 表示 無用值 的占位符, 就是 "無值" 的值;
塊表達(dá)式和賦值
在scala 中, { } 塊包含一系列表達(dá)式, 其結(jié)果也是一個(gè)表達(dá)式; 塊中最后一個(gè)表達(dá)式的值就是塊的值;
val d = { val e =3 }
=>在scala中, val e=3 這個(gè)賦值動(dòng)作本身是沒有值的, 或者說它們的值是Unit類型, 所以 d 的值為()
循環(huán)
scala擁有與java相同的 while和do 循環(huán),但是for 循環(huán)做了改變;
for( i <- 集合變量或表達(dá)式 ) { }
=>scala 并沒有提供break 或 continue 語句來退出循環(huán),可以使用 boolean類型的控制變量, 以及擁有跳出循環(huán)的 return 來完成 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è)集合,此集合的類型會(huì)根據(jù)要遍歷的集合的類型保持一致,每次迭代生成一個(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ù)類型:?
def ?fun_def ( i:String ):String = { "this is def "}
fun_def : ?(i:String)String
?匿名函數(shù)的數(shù)據(jù)類型:
val ?no_name = (i:String) => { "this is no name" }
no_name : String => String = <function1>
=>理論上編譯器可以通過=右側(cè)的表達(dá)式的類型推斷出返回值類型,可以不寫,但一定要寫上=符號(hào); 如果不寫=符號(hào),系統(tǒng)會(huì)認(rèn)為是過程函數(shù), 默認(rèn)加上的是 :Unit= 空值標(biāo)記,類似void;
=>scala中有默認(rèn)參數(shù), def ?a ( i:String, j:String="test"):String={ i+j }
=> lazy val name = xxx ? 懶值并不是非沒有額外開銷,我們每次訪問懶值時(shí),都會(huì)一個(gè)方法被調(diào)用,而這個(gè)方法將會(huì)以線程安全的方式檢查該值是否被初始化;