3.1if else表達(dá)式
在Scala中,幾乎所有語法結(jié)構(gòu)都有值。
If語句的返回類型取決于最后一條語句艺糜。
Scala 沒有三元運(yùn)算符
If表達(dá)式會(huì)有一個(gè)返回值類型,如果if或者else返回的類型不一樣幢尚,就返回Any(公共超類)
對(duì)于空值破停,使用Unit類,寫做()【叫做無有用占位符尉剩,相當(dāng)于java中的void】
如果在單行中寫多個(gè)語句真慢,則需要分號(hào)分割。
塊包含一系列表達(dá)式理茎,其結(jié)果也是一個(gè)表達(dá)式黑界。塊中最后一個(gè)表達(dá)式的值就是塊的值。
3.2 while表達(dá)式
整個(gè)While 語句的結(jié)果是Unit類型的()皂林。
注:scala并沒有提供break和continue語句來退出循環(huán)
如果需要break朗鸠,可以通過幾種方法來做
1、使用Boolean型的控制變量
2础倍、使用嵌套函數(shù)童社,從函數(shù)中return
3、使用Breaks對(duì)象的break方法著隆。
3.3for表達(dá)式
推導(dǎo)式一詞起源于函數(shù)式編程扰楼。
像變量名<-集合這樣的表達(dá)式也被稱為生成器表達(dá)式
使用yield關(guān)鍵字便能在for表達(dá)式中生成新的集合呀癣。
3.4函數(shù)
Scala提供了很多函數(shù),如math函數(shù)
注:
1弦赖、Scala通過=右邊的表達(dá)式推斷出函數(shù)的返回類型项栏。如果函數(shù)體需多個(gè)表達(dá)式,用代碼塊{}蹬竖。
2沼沈、可以把return當(dāng)做函數(shù)版本的break 語句。
3币厕、遞歸函數(shù)一定要指定返回類型列另。
4、變長參數(shù)通過來指定旦装,所有參數(shù)會(huì)轉(zhuǎn)化為一個(gè)seq序列
5页衙、_告訴編譯器Range當(dāng)做參數(shù)序列化處理。
6阴绢、Head是獲得首元素店乐,tail是獲取剩下元素的序列。
3.5過程
沒有返回值的函數(shù)叫做過程呻袭,返回類型是Unit
3.6懶值
當(dāng)val被聲明為lazy時(shí)眨八,他的初始化將被推遲,直到我們首次對(duì)此取值左电。
懶值使用注意:
1)用于初始化開銷比較大的語句廉侧。
2)可以解決循環(huán)依賴問題。
3)是開發(fā)懶數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)篓足。
3.7異常
Scala的異常的工作機(jī)制和Java一樣段誊,但是Scala沒有“受檢”異常
所有異常都是Throwable的子類型。
throw表達(dá)式是有類型的纷纫,就是Nothing枕扫。因?yàn)镹othing是所有類型的子類型,所以throw表達(dá)式可以用在需要類型的地方辱魁。
在Scala里烟瞧,借用了模式匹配的思想來做異常的匹配,在catch的代碼里染簇,是一系列case字句参滴。
import org.scalatest.FunSuite
class Chapter02Test extends FunSuite {
test("ch0201") {
//傳統(tǒng)的if else 判斷
var bol = if (1 + 1 == 2) true else false
//if else 可以有返回值
val x = if (bol) 1 else -1
println(bol)
//類型不一致時(shí)候 返回超類Any
val y = if (x > 0) "false" else -1
//沒有返回值 返回Unit
val z = if (x > 0) 1
//一般不需要;分號(hào)
var a = 1
//多行代碼寫在一行 需要使用;分好 可以不使用大括號(hào)
if (a > 0) {
println(1);
println(2)
}
//{} 代碼塊的值就是最后一個(gè)表達(dá)式的值
if (a > 0) {
a -= 1
}
}
test("ch0202") {
//占位符
val name = "jim"
val age = 42.22
println(f"Hello, $name! You are $age%7.2f years old%n")
}
test("ch0203") {
//while循環(huán)結(jié)構(gòu) 以及break跳出循環(huán)
import scala.util.control.Breaks._
var index = 10
while (index >= 0) {
index = index - 1
println(index)
if (index == 5) {
break
}
}
//do while循環(huán)結(jié)構(gòu)
index = 10
do {
index = index - 1
println(index)
} while (index >= 0)
}
test("ch0204") {
//for循環(huán) 1到10
for (i <- 1 to 10) {
println(i)
}
//for循環(huán) 多個(gè)變量
for (i <- 1 to 9; j <- 1 to 9) {
println(i * j)
}
//for循環(huán) 條件表達(dá)式 守衛(wèi)模式(支持多個(gè)條件表達(dá)式)
for (i <- 1 to 9; j <- 1 to 9; if i != j) {
println(i * j)
}
//for循環(huán)引入變量
for (i <- 1 to 3; from = 4 - i; j <- from to 3) print((10 * i + j) + " ")
//for循環(huán)推導(dǎo)式y(tǒng)ield
var result = for (i <- 1 to 10) yield i
println(result)
}
//定義一個(gè)函數(shù) 函數(shù)的返回值可以自行推斷
def abs(n: Int) = {
if (n < 0) {
-n
} else {
n
}
}
//定義一個(gè)遞歸函數(shù)必須指明類型
//這是一個(gè)階乘
def fun(n: Int): Int =
if (n <= 0) 1 else n * fun(n - 1)
//沒有返回值的函數(shù) 稱為過程
def printNumber(n: Int): Unit = {
for (i <- 1 to 10) println(i)
}
// 變長參數(shù)
def sum(args: Int*) = {
var result = 0
for (arg <- args) result += arg
result
}
test("ch0205") {
println(abs(-1))
printNumber(10)
}
//定義一個(gè)初始化的方法
def init(): String = {
"init"
}
//沒有延遲加載的函數(shù)
def noLazyFunction(): Unit = {
var str = init()
println(str)
}
//有延遲加載的函數(shù)
def lazyFunction() = {
lazy val str = init()
println(str)
}
test("ch0206") {
noLazyFunction()
lazyFunction()
}
//異常的處理
test("ch0207") {
import scala.math._
var index: Int = (-1)
//異常的拋出
if (index < 0) {
//throw new IllegalArgumentException("x must bigger than zero")
}
//異常的捕獲
try {
sqrt(-1)
} catch {
case e: Exception => println(e)
} finally {
println("finally")
}
}
}