Scala的控制結構和函數
阿新 • • 發佈:2018-09-08
tar scrip tro 上下 tps 變量 表達 uri map
控制結構和函數
先看以下簡單的一個條件表達式的demo
object TestConditional {
def main(args: Array[String]): Unit = {
// scala的if判斷表達式
var x = 1
if (x > 0) x = 10 else x = 20
println(x)
}
}
Scala的if/else語法結構與java一樣,如以上代碼一樣,需要註意的是當else部分缺失了比如:if(x>0) 1,這個if語句沒有輸出值,但是在Scala中,每個表達式都應該有值,這個問題可以引入一個Unit類,寫做()。不帶else的這個if語句等同於 if (x>0) 1 else () Scala中沒有switch語句,只需if即可解決所有。
- 語句終止
在java和C++中,每一個語句都以分號結束,而在Scala中和JavaScript類似--行尾的位置不需要分號,因為Scala編譯器能夠從上下文明確判斷出是語句的終止,但是若要在單行中寫下多個語句,需要用分號隔開,例如下面的表達式需要分號隔開
if (n > 0) {r = r * n; n-=1}
若是在寫較長的語句,需要兩行來寫,需要告訴編譯器不是語句結尾,例子如下:
x = y + (v - m) * d + // +告訴編譯器不是結尾
0.5 * (c - v) * t
- 塊表達式和賦值
在java中,塊語句是一個包含與{}中的語句序列,在Scala中{}包含一系列表達式,在Scala中,賦值動作本身沒有值,它們是Unit類型,相當於java中的void,而這個類型只有一個值,寫做() {r = r * n; n-=1}
- 輸入和輸出
打印一個值可以使用print或者println函數, 例如: println("x="+"10"),另外還有一個帶有C風格格式化的字符串printf函數例如: printf("hello, %S! welcome to Scala world.\n","michael") 也可以使用readLine函數從控制臺讀取一行輸入,讀取數字,Boolean或者是字符,可以永readInt,readDouble,readByte,readShort,readLong,readFloat,readBoolean或者readChar。 // 使用readLine val name=readLine("your name:") print("your age") val age = readInt() printf("hello,%s! you have %d year work experience",name,age)
- 循環
Scala中沒有與for(初始化變量值;變量布爾表達式;變量更新),Scala中有兩個選擇:一個是使用while循環,而是使用以下for語句
for (i<- 表達式)讓變量i遍歷<-右邊的表達式的所有值,對於Scala集合比如Range而言,會取到集合中的每個值
Scala中沒有提供break或者continue語句退出循環,一般可以有以下三種方法跳出循環:
1. 使用Boolean型的控制變量
2. 使用嵌套函數---使用return
3. 使用breaks對象中的break方法
import scala.util.control.Breaks._
breakable {
for(...) {
// 退出循環
if(...) break;
}
}
- for循環推導式
Scala中的for循環比java要豐富的多,下面介紹其高級特性
// 多個生成器
for (i <- 1 to 3; j <- 1 to 3) print((10 * i + j) + " ")
println()
// 守衛生成器,if前沒有分號
for (i <- 1 to 3; j <- 1 to 3 if i != j) print((10 * i + j) + " ")
// 可以定義變量,在循環中引入
println()
for (i <- 1 to 3; from = 4 - i; j <- from to 3) print((10 * i + j) + " ")
for循環中的 yield 會把當前的元素記下來,保存在集合中,循環結束後將返回該集合。Scala中for循環是有返回值的。如果被循環的是Map,返回的就是Map,被循環的是List,返回的就是List,以此類推。
scala> for (i <- 1 to 5) yield i
res10: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5)
- 函數
Scala中定義函數需要定義函數的名稱、參數和函數體
def abs (x: Double) = if (x >= 0) x else -x
必須給出所有參數的類型,只要不是遞歸就不需指定返回類型。Scala會自動通過=符號右側的表達式的類型推斷出返回類型
// 遞歸函數,必須指定返回類型
def fac(n : Int) :Int = if (n<=0) 1 else n* fac(n -1)
以上代碼都可以在github獲取 https://github.com/codegeekgao/framework-skills/tree/master/scala-demo/src/main/scala/conditionalexpression
歡迎點綴加個star~~~
Scala的控制結構和函數