Scala基础4——第4章:流程控制

第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("循环外方法")
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值