第4章:流程控制
4.1 分支控制 if-else
分支控制有三种:单分支、双分支、多分支。
scala中没有switch语法
(1)基本语法
// 单分支
println("请输入你的年龄")
val age:Int = StdIn.readInt()
if (age >= 18)
println("成年")
// 双分支
if (age >= 18){
print("成年")
}else{
println("未成年")
}
// 多分支
if(age <= 6){
println("童年")
}else if(age < 18){
println("青少年")
}else if(age < 35){
println("青年")
}else if(age < 60){
println("中年")
}else{
println("老年")
}
if-else的返回值。返回最后一个分支的值
val result:Unit = if(age <= 6){
println("童年")
}else if(age < 18){
println("青少年")
}else if(age < 35){
println("青年")
}else if(age < 60){
println("中年")
}else{
println("老年")
}
print(result) // 返回一个Unit类型的值
val age = 20
val result2:String = if(age <= 6){
println("童年")
"童年"
}else if(age < 18){
println("青少年")
"青少年"
}else if(age < 35){
println("青年")
"青年"
}else if(age < 60){
println("中年")
"中年"
}else{
println("老年")
"老年"
}
print(result2) // 返回一个String类型的值
// 输出结果
// 青年
val result3:Any = if(age <= 6){
println("童年")
"童年"
}else if(age < 18){
println("青少年")
age
}else if(age < 35){
println("青年")
"青年"
}else if(age < 60){
println("中年")
age
}else{
println("老年")
"老年"
}
// 有的返回Int,有的返回String,就使用Any作为公共父类。
用if-else来替代三元运算符
val res:String = if(age>=18)
"成年"
else
"未成年"
// 等价于
val res:String = if(age>=18) "成年" else "未成年"
嵌套分支
if(age >= 18){
print("成年")
if(age>=35){
print("中年")
}else{
print("青年")
}
}else{
print("未成年")
}
4.2 For循环
(1)for表达式
object Test02{
def main(args:Array[String]):Unit={
for( i <- 1 to 10 ){
print(i+" ")
}
// 输出
// 1 2 3 4 5 6 7 8 9 10
//等价于, to是一个方法
for(i <- 1.to(10)){
print(i+" ")
}
// 输出
// 1 2 3 4 5 6 7 8 9 10
}
}
for (i <- Range(1,10)){// 左闭右开
print(i+" ")
}
// 输出结果
// 1 2 3 4 5 6 7 8 9
for(i <- 1 until 10){// 左闭右开
print(i+" ")
}
// 输出结果
// 1 2 3 4 5 6 7 8 9
(2)集合遍历
for ( i <- Array(12,34,54,23,454)){
println(i)
}
// 12
// 34
// 54
// 23
// 454
for ( i <- List(12,34,54,23,454)){
println(i)
}
for ( i <- Set(12,34,54,23,454)){
println(i)
}
(3)循环守卫
//如果i==2 则跳过
for (i <- 1 to 5 if i!=2){
print(i+" ")
}
// 输出结果
// 1 3 4 5
for (i <- 1 to 5 if i>2){
print(i+" ")
}
// 输出结果
// 3 4 5
(4)循环步长
for (i <- 1 to 10 by 2){ //步长为2
print(i+" ")
}
// 输出结果
// 1 3 5 7 9
for( i <- 10 to 1 by -2){
print(i+" ")
}
// 输出结果
// 9 7 5 3 1
// 逆序输出
for ( i <- 10 to 1 reverse){
print(i+" ")
}
// 步长为小数
for(i <- 1.0 to 2.0 by 0.5 ){
print(i+" ")
}
// 1.0 1.5 2.0
//注:步长不能为0
(5)嵌套循环
for( i <- 1 to 3){
for (j <- 1 to 5){
print(s"i=${i},j=${j}")
}
}
// 等价于
for( i <- 1 to 3; j<- 1 to 5){
print(s"i=${i},j=${j}")
}
// 输出结果
// i=1 , j=1
// i=1 , j=2
// i=1 , j=3
// i=1 , j=4
// i=1 , j=5
// i=2 , j=1
// i=2 , j=2
//.............
用嵌套for循环实现99乘法表
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()
}
(6)for循环引入变量
for(i <- 1 to 10){
val j = 10 - i
println("i="+i+",j="+j)
}
// 等价于
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)
}
(7)循环返回值
默认情况下返回Unit
val res:Unit = for ( i <- 1 to 10){
println(i)
}
print(res)
// 输出结果
// ()
使用类似于python的生成器 yield
// yield 生成一个集合类型,然后作为返回值
val a = for(i <- 1 to 10){
yield i
}
print(a)
// 输出结果
// Vector(1,2,3,4,5,6,7,8,9,10)
4.3 While和do While循环
While和doWhile和Java是一模一样的。
scala中并不推荐while
object Test05{
def main(args:Array[String]):Unit={
var a:Int = 10
while(a >= 1){
print(a+" ")
a -= 1
}
}
}
//输出结果
// 10 9 8 7 6 5 4 3 2 1
var b:Int = 0
do{
print(b+" ")
b -= 1
}while(b > 0)
// 输出结果
// 0
4.4 循环中断
Scala中没有break和continue
continue可以使用循环守卫
break可以使用抛出异常来中断
或者 用Breaks类的break方法实现抛出和捕捉
java
for(int i =0;i<5;i++){
if(i == 3)
break;
System.out.println(i);
}
try{
for(int i =0;i<5;i++){
if(i == 3)
throws new RuntimeException();
System.out.println(i);
}
}catch(Exception e){
// 退出循环
}
scala
object Test06{
def main(args:Array[String]):Unit={
try{
for(i <- 0 until 5){
if(i==3)
throw new RuntimeException
println(i)
}
}catch{
case e: Exception => println("退出循环")
}
println("循环外代码")
}
}
使用 Breaks类的break方法实现抛出和捕捉
import scala.util.control.Breaks._
object Test06{
def main(args:Array[String]):Unit={
Breaks.breakable(
for(i <- 0 until 5){
if(i==3)
Breaks.break() // break方法
println(i)
}
)
print("循环外方法")
}
}