6.Scala程序流程控制

一、程序流程控制概述

1) 顺序控制
2) 分支控制
3) 循环控制

二、If

if (条件表达式 1) {
    执行代码块 1
}
else if (条件表达式 2) {
    执行代码块 2
}
……
else {
    执行代码块 n
}
Scala 中任意表达式都是有返回值的,也就意味着 if else表达式其实是有返回结果的,具体返回结果的值取决于满足条件的代码体的最后一行内容

If 嵌套分支

一个分支结构中又完整的嵌套了另一个完整的分支结构

if(){
    if(条件表达式){
        执行代码块 1
    }else{
        执行代码块 2
    }
}

三、switch

==在 scala 中没有 switch,而是 使用模式匹配来处理==

四、for 循环控制

1.范围数据循环方式

//输出 10 句 "hello"
for (i <- 1 to 10) {   //包括右边部分
// for(i <- 1 until 11) // 不包括右边部分
    println("hello " + i)
}


// 直接对集合进行遍历
for (item <- list) {
    println("item=" + item)
}

2.循环守卫

① 循环保护式(也称条件判断式,守卫)。保护式为 true 则进入循环体内部,为 false则跳过,类似于 continue
// i从1到3,并且i不等于2
for(i <- 1 to 3 if i != 2) {
    println(i + " ")
}
② 引入变量,没有关键字,所以范围后一定要加;来隔断逻辑
for(i <- 1 to 3; j = i + 10) {
    println(j)
}

③ 嵌套循环

// 嵌套循环i从1-3 , j从2-4
for (i <- 1 to 3; j <- 2 to 4) {
    println("i=" + i + " , j=" + j)
}

i=1 , j=2
i=1 , j=3
i=1 , j=4
i=2 , j=2
i=2 , j=3
i=2 , j=4
i=3 , j=2
i=3 , j=3
i=3 , j=4

④ 循环返回值

将遍历过程中处理的结果返回到一个新 Vector 集合中,使用 yield 关键字
val res = for(i <- 1 to 10) yield {
    i  // 实际上输出的就是i的集合
}
println(res)

⑤使用花括号{}代替圆括号(),可以省略分号

for{
    i <- 1 to 3
    j = i * 2
} 
{
    println(" i= " + i + " j= " + j)
}

⑥ 使用步长-Range控制

//Range(1,10,2) 的对应的构建方法是
//def apply(start: Int, end: Int, step: Int): Range = new Range(start, end, step)
for (i <- Range(1, 10, 2)) {
    println("i=" + i)
}

五、while

while (循环条件) {
    循环体(语句)
    循环变量迭代
}
  1. 循环条件是返回一个布尔值的表达式
  2. while 循环是** 先判断,再执行 **语句
  3. 与 If 语句不同,While 语句本身没有值,即整个 While 语句的结果是 Unit 类型的()
  4. 因为 while 中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免的使用变量 ,而变量需要声明在 while循环的外部,那么就等同于循环的内部对外部的变量造成了影响,所以不推荐使用,而是 推荐使用 for 循环

六、do while

do{
    循环体(语句)
    循环变量迭代
} while(循环条件)
  1. 循环条件是返回一个布尔值的表达式
  2. do..while 循环是 先执行,再判断
  3. 和 while 一样,因为do…while中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免的使用变量 ,而变量需要声明在do...while循环的外部,那么就等同于循环的内部对外部的变量造成了影响,所以不推荐使用,而是 推荐使用 for 循环

七、while循环的中断

Scala 内置控制结构特地去掉了break和continue,是为了更好的适应函数化编程,推荐使用函数式的风格解决 break 和 contine 的功能,而不是一个关键字。

1.实现continue

for (i <- 1 to 10 if (i != 2 && i != 3)) {
    println("i=" + i)
}

2.通过break字段(需要在 Breaks.breakable 中)

val breaks = new Breaks
breaks.breakable {
    for (i <- 1 to 100) {
        sum += i
        if (sum > 20) {
            println("第一次和大于 20 的当前数=" + i)
            breaks.break()
        }
    }
}

3.通过重置状态 loop(true | false)

for (i <- 1 to 100 if loop == true) {
    sum2 += i
    if (sum2 > 20) {
        loop = false
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342

推荐阅读更多精彩内容