学习链接:https://www.bilibili.com/video/BV1Xh411S7bP?p=34&spm_id_from=pageDriver
1 分支控制
object Test01_ifelse {
def main(args: Array[String]): Unit = {
val age: Int = StdIn.readInt()
// 单分支
if (age >= 18) {
println("成年")
}
// 双分支
if (age >= 18) {
println("成年")
} else {
println("未成年")
}
// 多分支
if (age <= 6) {
println("童年")
} else if (age < 18) {
println("青少年")
} else if (age < 35) {
println("青年")
} else if (age < 60) {
println("中年")
} else {
println("老年")
}
}
}
// 分支语句的返回值
val result: String = if (age <= 6) {
println("童年")
"童年"
} else if (age < 18) {
println("青少年")
"青少年"
} else if (age < 35) {
println("青年")
"青年"
} else if (age < 60) {
println("中年")
"中年"
} else {
println("老年")
"老年"
}
println("result:" + result) // result:中年
// 分支语句的返回值
// Int和String的公共父类Any
val result: Any = if (age <= 6) {
println("童年")
"童年"
} else if (age < 18) {
println("青少年")
"青少年"
} else if (age < 35) {
println("青年")
age
} else if (age < 60) {
println("中年")
age
} else {
println("老年")
"老年"
}
println("result:" + result) // result:19
2 For循环
2.1 范围遍历
object Test02_ForLoop {
def main(args: Array[String]): Unit = {
for (i <- 1 to 10) {
println(i + ".hello world")
}
// 等同于
for (i <- 1.to(10)){
// 1.to(10)返回的是Range.Inclusive,包含边界[1,10]
println(i + ".hello world")
}
// 用伴生对象,1<=i<10,步长默认是1
for (i <- Range(1, 10)) {
println(i + ".hello world")
}
// i <- 1 until 10
for (i <- 1 until 10) {
println(i + ".hello world")
}
}
}
2.2 集合遍历
object Test02_ForLoop {
def main(args: Array[String]): Unit = {
// 2. 集合遍历
for (i <- Array(12, 34, 53)) {
println(i)
}
for (i <- List(12, 34, 53)) {
println(i)
}
for (i <- Set(12, 34, 53)) {
println(i)
}
}
}
2.3 循环守卫
// 3. 循环守卫
for(i <- 1 to 3 if i != 2) {
println(i)
}
2.4 循环步长
// 4. 循环步长
for (i <- 1 to 10 by 2) {
println(i)
}
// 倒序一
for (i <- 30 to 1 by -2) {
println(i)
}
// 倒序二
for (i <- 1 to 10 reverse) {
print(i + " ") // 10 9 8 7 6 5 4 3 2 1
}
步长step不能为0
for (i <- 1 to 10 by 0) { print(i + " ") }
步长step为0.5,最好用BigDecimal,否则可能精度缺失
for (i <- 1.0 to 5.0 by 0.5) { print(i + " ") // 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 }
2.5 嵌套循环
// 4. 循环嵌套 for (i <- 1 to 3) { for (j <- 1 to 3) { println("i= " + i + ",j=" + j) } }
for (i <- 1 to 3; j <- 1 to 3) { println("i= " + i + ",j=" + j) }
乘法表
def main(args: Array[String]): Unit = { for (i <- 1 to 9) { for (j <- 1 to i) { print(s"$j * $i = ${i * j} \t") } println() } // 简写 for (i <- 1 to 9; j <- 1 to i) { print(s"$j * $i = ${i * j} \t") if (j == i) println() } }
2.6 引入变量
```scala // 引入变量 for (i <- 1 to 10; j = 10 - i) { println(“i = “ + i + “,j = “ + j) }
for { i <- 1 to 10 j = 10 - i } { println(“i = “ + i + “, j = “ + j) }
<a name="jdedc"></a>
## 2.7 循环返回值
将遍历过程中处理的结果返回到一个新Vector集合中,使用yeild关键字
```scala
val b: immutable.IndexedSeq[Int] = for (i <- 1 to 10) yield i
println("b=" + b) // b=Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val b: immutable.IndexedSeq[Int] = for (i <- 1 to 10) yield i * i
println("b=" + b) // b=Vector(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
3 While循环
// while
var a: Int = 10
while (a >= 1) {
println("this is a while loop:" + a)
a -= 1
}
def main(args: Array[String]): Unit = {
var b: Int = 0
do {
println("this is a do-while loop:" + b)
b -= 1
} while (b > 0)
}
while没有返回值,while语句的结果是Unit类型() 循环变量声明在while的外部,等同于循环的外部,那么就等同于循环的内部对外部的变量 造成了影响,所以不推荐使用,而是 推荐使用 for 循环
4 循环中断
Scala没有break和continue
object Test06_Break {
def main(args: Array[String]): Unit = {
// 1. 采用抛出异常方式,退出循环
try {
for (i <- 0 until 5) {
if (i == 3)
throw new RuntimeException
println(i)
}
} catch {
case e: Exception => // 什么都不做,退出循环
}
println("循环外代码")
// 2. 使用Scala中的Breaks类的break方法,实现异常的抛出和捕捉
Breaks.breakable(
for(i <- 0 until 5) {
if (i == 3)
Breaks.break()
}
)
}
}
import scala.util.control.Breaks._
object Test06_Break {
def main(args: Array[String]): Unit = {
// 2. 使用Scala中的Breaks类的break方法,实现异常的抛出和捕捉
breakable(
for(i <- 0 until 5) {
if (i == 3)
break()
}
)
}
}