控制结构
控制结构
1 if else
Scala的控制结构基本思想与Java相似,但是语法不同。
- if else的语句输出结果还可以单独赋值给一个变量。
val i = 10;
val result = if(i > 10){
println("大于10")
}else{
println("小于等于10")
}
println(result)
这个if else语句的输出结果赋给了result,那result是什么呢?result是空,因为prinln函数的返回值是空(unit)。
小于等于10
()
如果我们在 i > 10的情况下输出一个数字10,那result就会被赋值10,演示如下:
val i = 15;
val result = if(i > 10){
println("大于10")
10
}else{
println("小于等于10")
}
println(result)
}
大于10
10
Process finished with exit code 0
- Scala的if else返回值依然是代码中的最后一行,和当时学方法返回值时准则相同。
- 定义result的时候,没有指定类型,又因为if else返回值有可能是if的返回结果(int)也有可能else后面的返回值(unit)。Scala的类型推断无法确定,因此自动给result推断一个他们的父类AnyVal。
如下示例道理相同(字符串是引用类型,Any是最顶级的父类):
下面是Scala各种数据类型关系图
scala的if else语句和Java一样,严格来说也只是一个语句,因此也可以简写为:
val result2 = if (i > 10) println("大于10") else println("小于等于10")
条件表达式
//根据Scala if else语句 有返回值的思想
// 得到Scala的条件表达式改造写法
val result4 = if(i > 10) 1 else 0
2 while
2.1 while循环
- 没有返回值
- 和 Java一样有do while 和 while
var i = 0;
val result = while (i < 10){
println(i)
i += 2
}
println(result)
编写了一个while,可以看到最后result打印出的是空()(Unit)。
2
4
6
8
()
Process finished with exit code 0
注: 因为 while 和 do…while 中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免的使用变量 , 而变量需要声明在 while 循环的外部,那么就等同于循环的内部对外部的变量造成了影响, 也就违背了函数式编程的重要思想,所以不推荐使用。
2.2 while循环中断
- 循环时候break continue 都不符合面向对象编程思想,因此Scala中不支持使用。
- Scala 内置控制结构特地去掉了 break 和 continue,是为了更好的适应函数化编程,推荐使用函数式的风格解决 break 和 contine 的功能,而不是一个关键字。
首先导入一个包:
import scala.util.control.Breaks._
我们应用这个包下的breakable函数 :
var i = 0;
breakable(
//被当作匿名函数
() =>
while (i < 10){
println(i)
i += 2
}
)
也可以把代码封装成一个方法,将这个方法作为参数传入breakable函数。
breakable(testWhile _ )
def testWhile():Unit = {
while (i < 10){
println(i)
i += 2
}
}
-
函数作为一个参数传入另一个函数,这种函数是高阶函数
-
如何中断?(使用break())
breakable {
while (i < 10) {
println(i)
i += 2
if(i == 6){
break()
}
}
}
- 操作的所有都是函数来解决问题
- breakable()是函数
- 传入的while代码是匿名函数
- 终止条件是break()也是函数
3 for循环
分为推导式和表达式
推导符号 <-
3.1前闭后闭
// for(int s : {1,2,3,4}){
//
// }
for(i <- 1 to 5){
println(i)
}
}
运行结果:
1
2
3
4
5
Process finished with exit code 0
3.2 前开后闭
- 刚刚实验的是[1,5]前闭后闭
- 现在介绍一个关键字until可以前开后闭
//[1,5)
for(i <- 1 until 5){
println(i)
}
1
2
3
4
Process finished with exit code 0
3.3 循环守卫
引入循环保护式(也称条件判断式,守卫)。保护式为 true 则进入循环
体内部, 为 false 则跳过,类似于 continue
//守卫条件类似于continue的用法(比continue更强大)
//[1,5)
for(i <- 1 until 5 if(i != 3) ){
println(i)
}
1
2
4
Process finished with exit code 0
3.4 引用变量(倒序输出)
for(i <- 1 to 5; j = 6 - i){
println(j)
}
5
4
3
2
1
Process finished with exit code 0
3.5 嵌套循环
for(i <- 1 to 5){
for(j <- 4 to 6){
println(i + "," + j)
}
}
1,4
1,5
1,6
2,4
2,5
2,6
3,4
3,5
3,6
4,4
4,5
4,6
5,4
5,5
5,6
Process finished with exit code 0
还可以写的更简单
for(i <- 1 to 5; j <- 4 to 6){
println(i + "," + j)
}
3.6 循环返回值
将遍历过程中处理的结果返回到一个新集合中,使用 yield 关键字
//利用for循环产生集合
val nums = for(i <- 1 to 5) yield i*10
println(nums)
Vector(10, 20, 30, 40, 50)
Process finished with exit code 0
3.7 使用花括号{}代替小括号()
for允许使用多个代码段。
for{i <- 1 to 5 ;
j <- 3 to 4;
if(i != 2 && j != 4)}{
}
4 小练习
用Scala打印九九乘法表
for{i <- 1 to 9;
j <- 1 to i}{
print(j + "×" + i + "=" + i * j + "\t");
if( j == i) println()
}
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
1×4=4 2×4=8 3×4=12 4×4=16
1×5=5 2×5=10 3×5=15 4×5=20 5×5=25
1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81
Process finished with exit code 0