if表達式的定義:在Scala中,if表達式是有值的,就是if或者else表達式中最後一行語句的返回值。java
object IfDemo { def main(args: Array[String]): Unit = { val age = 28 val isAdult = if (age > 25) 1 else 0 println(isAdult) } }
if表達式的類型推斷:因爲if表達式是有值的,Scala會自動對返回值的類型進行推斷,取if和else表達式的值類型的公共父類型。好比if表達式的值類型是Int,else表達式的值類型是Unit,也用()表示,則表達式的值類型是Any。這裏,Any是Int和Unit的公共類型。網絡
while do循環:Scala有while do循環,基本語義與Java相同。函數
object Demo { def main(args: Array[String]): Unit = { var n = 20 // 定義變量 while(n > 0) { println(n) n -= 1 } } }
Scala沒有for循環,只能使用while替代for循環,或者使用簡易版的for語句spa
簡易版的for語句:scala
object Demo { def main(args: Array[String]): Unit = { val n = 20 // 定義變量 for (i <- 1 to n) { println(i) } } }
Scala跳出循環語句:Scala沒有提供相似於java的break語句,可是可使用boolean變量、return或Breaks的break函數來替代使用。code
import scala.util.control.Breaks._ object Demo { def main(args: Array[String]): Unit = { breakable { var n = 10 for(c <- "Hello World") { if(n == 5) { break } print(c) n -= 1 } } } }
Scala之九九乘法表:blog
object Demo { def main(args: Array[String]): Unit = { for (i <- 1 to 9; j <- 1 to i) { print(i + "*" + j + "=" + (i * j) + "\t") if (i == j) { println() } } } }
if守衛:取偶數遞歸
object Demo { def main(args: Array[String]): Unit = { for (i <- 1 to 20 if i % 2 == 0) { println(i + "是偶數.") } } }
for推導式:構造集合it
object Demo { def main(args: Array[String]): Unit = { val newValue: Seq[Int] = for (i <- 1 to 10) yield { i * 2 } println(newValue) } }
Scala函數:在Scala中定義函數時,須要定義函數的函數名、參數、函數體。Scala要求必須給出全部參數的類型,可是不必定給出函數返回值的類型,只要右側的函數體中不包含遞歸的語句,Scala就能夠本身根據右側的表達式推斷出返回類型。io
函數定義:def 函數名(參數1:參數類型1,參數2:參數類型2...)[:返回值類型]={函數體}
舉例:
def sum(n: Int) = { var sum = 0for(i <- 1 to n) sum += i sum }
遞歸函數與返回類型:若是在函數體內遞歸調用函數自身則必須手動給出函數的返回類型。
舉例:實現經典的斐波那契數列
1, 1, 2, 3, 5, 8, 13, ...
def fab(n: Int): Int = { if(n <= 1) 1 else fab(n - 1) + fab(n - 2) }
Scala之默認參數:在Scala中,有時咱們調用某些函數時,不但願給出參數的具體值,而但願使用參數自身默認的值,此時就能夠在定義函數時使用默認參數。
def sayHello(firstName: String, middleName: String = "Jackson", lastName: String = "Jhon"): String = firstName + " " + middleName + " " + lastName
Scala之變長參數:在Scala中,有時咱們須要將函數定義爲參數個數可變的形式,則此時可使用變長參數定義函數。
舉例:
def sum(nums: Int*): Int = { var res = 0 for (num <- nums) { res += num } res }
使用序列調用變長參數:在若是想要將一個已有的序列直接調用變長參數函數,是不對的。好比val res = sum(1 until 10)。此時須要使用Scala的特殊語法將參數定義爲序列讓Scala解釋器可以識別。
舉例:使用遞歸函數實現累加
object Demo { def main(args: Array[String]): Unit = { println(sum(1 to 10: _*)) } def sum(nums: Int*): Int = { if (nums.length == 0) { 0 } else { nums.head + sum(nums.tail: _*) } } }
Scala中的lazy值:在Scala中,提供了lazy值的特性,也就是說,若是將一個變量聲明爲lazy,則只有在第一次使用該變量時,變量對應的表達式纔會發生計算。這種特性對於特別耗時的計算操做特別有用,好比打開文件進行IO,進行網絡IO等。
import scala.io.Source._
lazy val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString
即便文件不存在,也不會報錯,只有第一個使用變量時會報錯,證實了表達式計算的lazy特性。
val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString
lazy val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString
def lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString
Scala中的異常處理:在Scala中,異常處理和捕獲機制與Java是很是類似的。
import java.io.IOException object Demo { def main(args: Array[String]): Unit = { try { throw new IllegalArgumentException("x should not be negative") } catch { case _: IllegalArgumentException => println("Illegal Argument!") } finally { println("release resources!") } try { throw new IOException("user defined exception") } catch { case e1: IllegalArgumentException => println("illegal argument") case e2: IOException => println("io exception") } } }