【Scala】Scala的控制结构(分支、循环)

1 表达式

表达式:一个具有执行结果的代码块,结果是具体的值或者()

表达式和语句的区别和优势:

  • 表达式又返回值,语句被执行。表达式一般是一个语句块,执行后返回一个值
scala > if(true)"true string" else "false string"
res14:String = true string

scala > if(false) 5 else "hello"
res15: Any = hello
  • 不使用return语句,最后一个表达式即返回值
scala > val i =10
i: Int =10

scala > if(true)"true string" else "false string"
res14:String = true string

2 分支控制

2.1 单分支 if

和Java完全一样

if (age > 18) {
  println("age > 18")
}

2.2 双分支 if - else

if (age > 18) {
  println("age > 18")
}else{
  println("age < 18")
}

但是,有一点与Java不同的是,Scala中的if表达式的值可以赋值给变量,比如:

val x = 6
val a = if (x>0) 1 else -1

上述代码执行结束后,a的值为1。

2.3 多分支 if - else if -else

val x = 3
if (x>0) {
    println("This is a positive number")
} else if (x==0) {
    println("This is a zero")
} else {
    println("This is a negative number")
}

2.4 嵌套分支

注意:嵌套最好不超过三层

	if(a==1){ 
		print("1")
		if(b==2){
			print("2")
		}else{
			print("3")
		}
	}else{
		print("4")
	}

2.5 注意事项

1、如果大括号{}内的逻辑代码只有一行,大括号可以省略

2、Scala中任意表达式都是有返回值的,也就意味着if else表达式其实是有返回结果的,具体返回结果取决于满足条件的代码体的最后一行内容

val age = 70
val res = if (age > 20){
	println("1")
	9+10
	"yes"
	}else{
		7
	}

输出:yes

3、Scala没有三元运算符

java:int result = flg ? 1:0

Scala:val result = if (flg) 1 else 0

4、Scala没有switch分支结构,而是使用模式匹配来处理

3 for循环

Scala为for循环提供非常多的特性,这些特性被称为for循环推导式或者for表达式

3.1 范围数据循环方式 to、until

1、第一种(to)

for(i <- 1 to 3{
	print(i+" ")
}

说明:

  1. i 表示循环的变量,<- 规定好 to 规定
  2. i 将会从 1 到 3 循环,前后闭合

for这种推导式,可以直接对集合进行遍历

var list = list("hello",10,20,"tom")
for(item <- list){
	print(item)
}

输出结果:hello 10 20 tom

2、第二种(until)

for(i <- 1 until 3{
	print(i+" ")
}

说明:

  1. 与第一种区别在于 i 是从 1 到 2
  2. 左闭右开

3.2 for循环守卫

基本案例:

for(i <- 1 to 3 if i !=2{
	print(i+" ")
}

说明:

  1. 循环守卫,即循环保护式,保护式为true进入循环体,false则跳过
  2. 类似于continue
  3. 等价于这种写法
for(i <- 1 to 3{
   if(i !=2){
   print(i+" ")
   }	
}

3.3 引入变量

基本案例:

for(i <- 1 to 3 ; j = 4-i){
	print(i+" ")
}

说明:

  1. 没有关键字,所以范围后面要加
  2. 等价于这种写法
for(i <- 1 to 3{
	val j = 4-i
	print(i+" ")
}

3.4 嵌套循环

基本案例:

for(i <- 1 to 3 ; j <- 1 to 3{
	print(i+" ")
}

说明:

  1. 没有关键字,加;
  2. 等价于这种写法
for(i <- 1 to 3{
	for (j <- 1 to 3){
		print(i+" ")
	}
}

3.5 循环返回值

基本案例:

val res = for(i <- 1 to 10) yield i
println(res)

说明:

  1. 将遍历过程中处理的结果返回到一个新的vector集合中,使用yield关键字
  2. 含义:
  • 对 1 to 10 遍历
  • yield i 将 每次循环得到的 i 放入到集合Vector中,并返回给res
  • i 这里是一个代码块,意味着可以对 i 进行逻辑处理,如下:
val res = for(i <- 1 to 10) yield {
   if(){
   	i
   }else{
   	"hello"
   }
}

3.6 步长控制

1、for(i <- Range(1,3,2))

Range(1,3,2):start为1,end为3,步长为2

2、for循环守卫

for (I <- 1 to 10 if i % 2 == 1)

步长为2

3、for(i <- 1 to 10 by 2)

4 while循环

基本语法

while(循环条件){
	循环体(语句)
	循环变量迭代
}

例子:

var i =0
while(i < 10){
	print("hello")
	i += 1
}

注意:

  1. 循环条件是返回一个布尔值的表达式
  2. while循环是先判断后执行语句
  3. 与if语句不同,while语句本身没有值,即整个while语句的结果都是unit类型

4.1 while循环的中断

Scala去除break和contine关键字

1、使用break()实现break

import scala.util.control.Breaks.break

var n =1
while(n<=20){
  n+=1
  if(n==18){
    break()
  }
}

2、使用if-else或者循环守卫实现continue

5 Do while循环

基本语法

do{
    循环体(语句)
	循环变量迭代
}while(循环条件)

6 多重循环案例

1、统计三个班的成绩情况,每个班5名同学,求出各个班的平均分和所有班级的平均分

思路:

  1. classNum 表示班级个数,stuNum 表示学生个数
  2. classScore 表示各个班级的总分,totalScore 表示所有班级的总分
  3. score 表示个人的分
  4. 使用循环的方式输入成绩
import scala.io.StdIn

object TestScala {
  def main(args: Array[String]): Unit = {
    val classNum = 3
    val stuNum = 5
    var score = 0.0
    var classScore = 0.0
    var totalScore = 0.0
    for(i <- 1 to classNum){
      classScore=0.0
      for(j<-1 to stuNum){
        printf("请输入第%d个班级第%d个学生的成绩\n",i,j)
        score = StdIn.readDouble()
        classScore+=score
      }
      totalScore+=classScore
      printf("第%d个班级的平均分为%.2f\n",i,classScore/stuNum)
    }
    printf("所有班级的平均分%.2f",totalScore/(stuNum*classNum))
  }
}

2、九九乘法表

val num =9
    for(i <- 1 to num){
      for(j<-1 to i){
        printf("%d * %d = %d\t",j,i,i*j)
      }
      println()
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐的冲浪码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值