scala03.控制結(jié)構(gòu)和函數(shù)

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")
    }
  }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锻弓,隨后出現(xiàn)的幾起案子砾赔,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暴心,死亡現(xiàn)場離奇詭異妓盲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)专普,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門悯衬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人檀夹,你說我怎么就攤上這事筋粗。” “怎么了炸渡?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵娜亿,是天一觀的道長。 經(jīng)常有香客問我蚌堵,道長买决,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任辰斋,我火速辦了婚禮策州,結(jié)果婚禮上瘸味,老公的妹妹穿的比我還像新娘宫仗。我一直安慰自己,他們只是感情好旁仿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布藕夫。 她就那樣靜靜地躺著,像睡著了一般枯冈。 火紅的嫁衣襯著肌膚如雪毅贮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天尘奏,我揣著相機(jī)與錄音滩褥,去河邊找鬼。 笑死炫加,一個(gè)胖子當(dāng)著我的面吹牛瑰煎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俗孝,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼酒甸,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了赋铝?” 一聲冷哼從身側(cè)響起插勤,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后农尖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體析恋,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年盛卡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绿满。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窟扑,死狀恐怖喇颁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嚎货,我是刑警寧澤橘霎,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站殖属,受9級(jí)特大地震影響姐叁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洗显,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一外潜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挠唆,春花似錦处窥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俄讹,卻和暖如春哆致,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背患膛。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國打工摊阀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人踪蹬。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓胞此,卻偏偏與公主長得像,于是被迫代替她去往敵國和親延曙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子豌鹤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容