1. IfElse
1.1 单分支
单独一个if
package chapter04import scala.io.StdInobject Test01_IfElse {def main(args: Array[String]): Unit = {println("请输入您的年龄:")val age: Int = StdIn.readInt()// 1. 单分支println("========= 单分支 =========")if (age >= 18) {println("成年")}}}
1.2 双分支
标准的if-else
package chapter04import scala.io.StdInobject Test01_IfElse {def main(args: Array[String]): Unit = {println("请输入您的年龄:")val age: Int = StdIn.readInt()//2. 双分支println("========= 双分支 =========")if (age >= 18) {println("成年")} else {println("未成年")}}}
1.3 多分支
if - else if - else,也是很常见的结构
package chapter04import scala.io.StdInobject Test01_IfElse {def main(args: Array[String]): Unit = {println("请输入您的年龄:")val age: Int = StdIn.readInt()// 3. 多分支println("========= 多分支 =========")if (age <= 6) {println("童年")} else if (age < 18) {println("青少年")} else if (age < 35) {println("青年")} else if (age < 60) {println("中年")} else {println("老年")}}}
1.4 分支的返回值
一切皆对象。那么 if 判断语句到底会给我们返回什么东西呢?
我们甚至还能指定返回值
package chapter04import scala.io.StdInobject Test01_IfElse {def main(args: Array[String]): Unit = {println("请输入您的年龄:")val age: Int = StdIn.readInt()// 分支语句的返回值// 默认是Unit,但是我们可以指定返回值println("========= 分支返回值 =========")val result: Any = if (age <= 6) {println("童年")"童年"} else if (age < 18) {println("青少年")"青少年"} else if (age < 35) {println("青年")"青年"} else if (age < 60) {println("中年")age} else {println("老年")age}println("result: " + result)}}
1.5 三元运算符
这里面没有类似 Java 的三元运算符 a?b:c ,但是我们有其他写法。
package chapter04import scala.io.StdInobject Test01_IfElse {def main(args: Array[String]): Unit = {println("请输入您的年龄:")val age: Int = StdIn.readInt()// JAVA 中三元运算符 a?b:cval res1: String = if (age >= 18) {"成年"} else {"未成年"}// 另一种写法,更简洁val res2 = if (age >= 18) "成年" else "未成年"}}
1.6 嵌套分支
if 里面套 if ,没啥好说的。
package chapter04import scala.io.StdInobject Test01_IfElse {def main(args: Array[String]): Unit = {println("请输入您的年龄:")val age: Int = StdIn.readInt()// 5. 嵌套分支// if 里面套 ifprintln("========= 嵌套分支 =========")if (age >= 18) {println("成年")if (age >= 35) {if (age > 60) {println("老年")} else {println("中年")}}} else {println("未成年")if (age <= 6) {println("童年")} else {println("青少年")}}}}
2. WhileLoop
2.1 while
和普通的While一致。
package chapter04object Test05_WhileLoop {def main(args: Array[String]): Unit = {// whilevar a: Int = 10while (a >= 1) {println("This is a while loop: " + a)a -= 1}}}
2.2 do-while
do-while的形式,会先执行一次,再进入while判断。
package chapter04object Test05_WhileLoop {def main(args: Array[String]): Unit = {// 还是会输出一次var b: Int = 0do {println("This is a do-while loop:" + b)b -= 1} while (b > 0)}}
3. ForLoop
3.1 范围遍历
注意对比Java的情况。深入一下 to 和 range 以及 until 的源码。
package chapter04import scala.math.BigDecimal.double2bigDecimalobject Test02_ForLoop {def main(args: Array[String]): Unit = {/* java for语法:for (int i = 0; i < 10; i++){System.out.println("Hello World")}*/// 1. 范围遍历for (i <- 1 to 5) {println(i + "hello world")}/* 更面向对象一些这里实际上点进 to ,里面不是Int的方法而是RichInt的方法。这里涉及到了 Int 到 RichInt 的隐式转换。这里我们得到了 Range下面的Inclusive*/println("===========分割线========")for (i <- 1.to(5)) {println(i.+(".hello world"))}// 如果要不包含边界呢?// 直接声明rangeprintln("===========分割线========")for (i <- Range(1, 10)) {println(i.+(".hello world"))}println("===========分割线========")for (i <- 1 until 5) {println(i + "hello world")}}}
3.2 集合遍历
如果遍历对象是一个Array、List之类的呢?
package chapter04import scala.math.BigDecimal.double2bigDecimalobject Test02_ForLoop {def main(args: Array[String]): Unit = {// 2.集合遍历println("\n===========集合遍历========")for (i <- Array(12, 34, 53)) {println(i)}for (i <- List(11, 33, 44)) {println(i)}for (i <- Set(112, 333, 22)) {println(i)}}}
3.3 循环守卫
Scala中不使用 continue关键字,而是用 if 来代替
package chapter04import scala.math.BigDecimal.double2bigDecimalobject Test02_ForLoop {def main(args: Array[String]): Unit = {// 3. 循环守卫println("\n===========循环守卫========")for (i <- 1 to 10) {if (i != 5) {println(i)}}for (i <- 1 to 10 if i != 5) {println(i)}}}
3.4 循环步长
循环中怎么控制步长?注意看 by 的源码
package chapter04import scala.math.BigDecimal.double2bigDecimalobject Test02_ForLoop {def main(args: Array[String]): Unit = {// 4. 循环步长// 看看源码,其实是通过 Range 实现的// step不能为0println("\n===========循环步长========")for (i <- 1 to 10 by 2) { // 看看源码,by 其实是通过 Range 实现的println(i)}for (i <- 10 to 1 by -2) { // 倒序println(i)}// Double 弃用,使用BigDecimalfor (i <- 1.0 to 3.0 by 0.5) {println(i)}}}
3.5 循环嵌套
循环中套循环。当然也有更扁平的写法。
package chapter04import scala.math.BigDecimal.double2bigDecimalobject Test02_ForLoop {def main(args: Array[String]): Unit = {// 5. 循环嵌套println("\n===========嵌套循环========")for (i <- 1 to 3) {for (j <- 1 to 3) {println("i = " + i + " ,j= " + j)}}println("\n===========嵌套循环2========")for (i <- 1 to 2; j <- 1 to 4) {println("i = " + i + " ,j= " + j)}}}
3.6 循环引入变量
循环中引入一个相关变量。
package chapter04import scala.math.BigDecimal.double2bigDecimalobject Test02_ForLoop {def main(args: Array[String]): Unit = {// 6. 循环引入变量println("\n==========循环引入变量===========")for (i <- 1 to 10) {val j = 10 - iprintln("i = " + i + " ,j= " + j)}for (i <- 1 to 10; j = 10 - i) {val j = 10 - iprintln("i = " + i + " ,j= " + j)}for {i <- 1 to 10j = 10 - i} {println("i = " + i + " ,j= " + j)}}}
3.7 循环返回值
循环的返回值,在Scala中一般默认为空。但是我们可以使用 yield 关键字。
package chapter04import scala.math.BigDecimal.double2bigDecimalobject Test02_ForLoop {def main(args: Array[String]): Unit = {// 7. 循环返回值// for 循环在默认情况下返回值都为空println("\n==========循环返回值===========")val a: Unit = for (i <- 1 to 10) {println(i)}println("a = " + a) // 空括号val b:IndexedSeq[Int] = for (i <- 1 to 10) yield iprintln("b = " + b)}}
4. Break
4.1 Java中的Break
public class TestBreak {public static void main(String[] args) {try {for (int i = 0; i < 5; i++) {if (i == 3)// break;throw new RuntimeException();System.out.println(i);}} catch (Exception e) {// 什么都不做,只是退出循环}System.out.println("这是循环外的代码");}}
4.2 普通抛异常
Scala里面没有所谓的 break 关键字来跳出循环,但是我们可以通过抛异常的方式来达到同样的效果。
package chapter04object Test06_Break {def main(args: Array[String]): Unit = {println("========= 抛异常退出循环 ========")// 1. 采用抛异常的形式退出循环try {for (i <- 0 until 5) {if (i == 3)throw new RuntimeExceptionprintln(i)}} catch {case e: Exception => // 什么都不做,只是退出循环}println("这是循环外的代码")}}
4.3 使用Breaks类
上面那种写法还是有点累,我们现在使用一个更简单的写法。
package chapter04import scala.util.control.Breaksimport scala.util.control.Breaks.breakobject Test06_Break {def main(args: Array[String]): Unit = {println("========= 抛异常退出循环 ========")// 2. 使用Scala中 Breaks 类的 break 方法,实现异常的抛出和捕捉// 不使用关键字,而是用方法来做Break,这样更面向对象Breaks.breakable(for (i <- 0 until 5) {if (i == 3)Breaks.break()println(i)})Breaks.breakable(for (i <- 0 until 5) {if (i == 3)break()println(i)})println("这是循环外的代码")}}
