04流程控制

本文最后更新于 2021-08-05 11:42:59

流程控制

分支

单分支

1
2
3
4
5
6
7
8
if  (条件表达式)  {
执行代码块
}
//任意语法结构都有返回值(while是Unit,赋值语句是Unit) 最后一行自动作为返回值
//if 语句有返回值,最后一行代码自动作为返回值
//所以三元运算符可以替换为
var i = if(a>b) a else b

双分支

1
2
3
4
5
if (条件表达式) {
执行代码块1
} else {
执行代码块2
}

多分支

1
2
3
4
5
6
7
8
9
10
if (条件表达式1) {
执行代码块1
}
else if (条件表达式2) {
执行代码块2
}
……
else {
执行代码块n
}

嵌套分支

1
2
3
4
5
if(){
if(){
}else{
}
}

For循环

普通for循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//i从1到3  (前后闭合)
for(i <- 1 to 3){
print(i + " ")
}
println()

//i从1到3-1(前闭后开)
for(i <- 1 until 3) {
print(i + " ")
}
//前后闭合
for(i<- 1 to 100 reverse){

}
//前后闭合
for(i<-100 to 1 by -1){

}

println()

循环守卫

1
2
3
4
5
6
//if i != 2  false相当于continue 
for(i <- 1 to 3 if i != 2) {
print(i + " ")
}
println()

循环步长

1
2
3
4
5
6
7
8
9
10
//步长为2
for(i <- 1 to (100,2)){

}

//range.by()
for (i <- 1 to 10 by 2) {
println("i=" + i)
}

引入变量

for推导式一行中有多个表达式时,所以要加来隔断逻辑

for推导式有一个不成文的约定:当for推导式仅包含单一表达式时使用圆括号,当包含多个表达式时,一般每行一个表达式,并用花括号代替圆括号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for(i <- 1 to 3; j = 4 - i) {
println("i=" + i + " j=" + j)
}

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

//等价于
for (i <- 1 to 3) {
var j = 4 - i
println("i=" + i + " j=" + j)
}


for(i<-1 to 100 if i%2==0;j=i*i if j<10000;k=j*j if k<10000){

}

循环返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
val res = for(i <- 1 to 10) yield i
println(res)

object TestFor {

def main(args: Array[String]): Unit = {

//1 to 100 --> 1.to(100)
var res = for( i <-1 to 10 ) yield {
i * 2
}

println(res)
}
}
//Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
//yield后面花括号相当于是主体 且不能有 return

跳出循环

scala没有跳出循环 break的关键字

但是可以通过抛异常的方式跳出循环、

demo:判断一个数是不是质数

1
2
3
4
5
6
7
8
9
10
11
12
13
val input = StdIn.readInt()
var isPriam =true
for(i<- 2 until input){
if(input%i==0){
isPriam=false
}

}
if(isPriam){
println(s"$input 是质数")
}else{
println(s"$input 不是质数")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
val input = StdIn.readInt()
var isPriam =true
try{
for(i<- 2 until input){
if(input%i==0){
isPriam=false
throw new IllegalArgumentException
}

}
}catch {
case _ =>
}

if(isPriam){
println(s"$input 是质数")
}else{
println(s"$input 不是质数")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import scala.util.control.Breaks

val input = StdIn.readInt()
var isPriam =true
Breaks.breakable{
for(i<- 2 until input){
if(input%i==0){
isPriam=false
Breaks.break()
}

}
}

if(isPriam){
println(s"$input 是质数")
}else{
println(s"$input 不是质数")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//把breaks下所有东西导进来
import scala.util.control.Breaks._

val input = StdIn.readInt()
var isPriam =true
breakable{
for(i<- 2 until input){
if(input%i==0){
isPriam=false
//break() 可以省略括号
break
}

}
}

if(isPriam){
println(s"$input 是质数")
}else{
println(s"$input 不是质数")
}

循环嵌套

1
2
3
4
5
//
for(i<-1 to 9;j<- 1 to i){
print(s"$j * $i = ${i*j}\t")
if(i==j) printlln()
}

While循环

先判断再执行

因为while中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免的使用变量,而变量需要声明在while循环的外部,那么就等同于循环的内部对外部的变量造成了影响,也就违背了函数式编程的重要思想(输入=>函数=>输出,不对外界造成影响),所以不推荐使用,而是推荐使用for循环。

1
2
3
4
5
var i = 0
while (i < 10) {
println(i)
i += 1
}

do..while

先执行再判断

1
2
3
4
5
6
var i = 0
do {
println( i)
i += 1
} while (i < 10)


04流程控制
https://jiajun.xyz/2020/10/27/scala/04流程控制/
作者
Lambda
发布于
2020年10月27日
更新于
2021年8月5日
许可协议