1. IfElse
1.1 单分支
单独一个if
package chapter04
import scala.io.StdIn
object 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 chapter04
import scala.io.StdIn
object 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 chapter04
import scala.io.StdIn
object 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 chapter04
import scala.io.StdIn
object 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 chapter04
import scala.io.StdIn
object Test01_IfElse {
def main(args: Array[String]): Unit = {
println("请输入您的年龄:")
val age: Int = StdIn.readInt()
// JAVA 中三元运算符 a?b:c
val res1: String = if (age >= 18) {
"成年"
} else {
"未成年"
}
// 另一种写法,更简洁
val res2 = if (age >= 18) "成年" else "未成年"
}
}
1.6 嵌套分支
if 里面套 if ,没啥好说的。
package chapter04
import scala.io.StdIn
object Test01_IfElse {
def main(args: Array[String]): Unit = {
println("请输入您的年龄:")
val age: Int = StdIn.readInt()
// 5. 嵌套分支
// if 里面套 if
println("========= 嵌套分支 =========")
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 chapter04
object Test05_WhileLoop {
def main(args: Array[String]): Unit = {
// while
var a: Int = 10
while (a >= 1) {
println("This is a while loop: " + a)
a -= 1
}
}
}
2.2 do-while
do-while的形式,会先执行一次,再进入while判断。
package chapter04
object Test05_WhileLoop {
def main(args: Array[String]): Unit = {
// 还是会输出一次
var b: Int = 0
do {
println("This is a do-while loop:" + b)
b -= 1
} while (b > 0)
}
}
3. ForLoop
3.1 范围遍历
注意对比Java的情况。深入一下 to
和 range
以及 until
的源码。
package chapter04
import scala.math.BigDecimal.double2bigDecimal
object 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"))
}
// 如果要不包含边界呢?
// 直接声明range
println("===========分割线========")
for (i <- Range(1, 10)) {
println(i.+(".hello world"))
}
println("===========分割线========")
for (i <- 1 until 5) {
println(i + "hello world")
}
}
}
3.2 集合遍历
如果遍历对象是一个Array、List之类的呢?
package chapter04
import scala.math.BigDecimal.double2bigDecimal
object 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 chapter04
import scala.math.BigDecimal.double2bigDecimal
object 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 chapter04
import scala.math.BigDecimal.double2bigDecimal
object Test02_ForLoop {
def main(args: Array[String]): Unit = {
// 4. 循环步长
// 看看源码,其实是通过 Range 实现的
// step不能为0
println("\n===========循环步长========")
for (i <- 1 to 10 by 2) { // 看看源码,by 其实是通过 Range 实现的
println(i)
}
for (i <- 10 to 1 by -2) { // 倒序
println(i)
}
// Double 弃用,使用BigDecimal
for (i <- 1.0 to 3.0 by 0.5) {
println(i)
}
}
}
3.5 循环嵌套
循环中套循环。当然也有更扁平的写法。
package chapter04
import scala.math.BigDecimal.double2bigDecimal
object 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 chapter04
import scala.math.BigDecimal.double2bigDecimal
object Test02_ForLoop {
def main(args: Array[String]): Unit = {
// 6. 循环引入变量
println("\n==========循环引入变量===========")
for (i <- 1 to 10) {
val j = 10 - i
println("i = " + i + " ,j= " + j)
}
for (i <- 1 to 10; j = 10 - i) {
val j = 10 - i
println("i = " + i + " ,j= " + j)
}
for {
i <- 1 to 10
j = 10 - i
} {
println("i = " + i + " ,j= " + j)
}
}
}
3.7 循环返回值
循环的返回值,在Scala中一般默认为空。但是我们可以使用 yield
关键字。
package chapter04
import scala.math.BigDecimal.double2bigDecimal
object 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 i
println("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 chapter04
object Test06_Break {
def main(args: Array[String]): Unit = {
println("========= 抛异常退出循环 ========")
// 1. 采用抛异常的形式退出循环
try {
for (i <- 0 until 5) {
if (i == 3)
throw new RuntimeException
println(i)
}
} catch {
case e: Exception => // 什么都不做,只是退出循环
}
println("这是循环外的代码")
}
}
4.3 使用Breaks类
上面那种写法还是有点累,我们现在使用一个更简单的写法。
package chapter04
import scala.util.control.Breaks
import scala.util.control.Breaks.break
object 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("这是循环外的代码")
}
}