文章目录
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+" ")
}
说明:
- i 表示循环的变量,
<-
规定好to
规定 - 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+" ")
}
说明:
- 与第一种区别在于 i 是从 1 到 2
- 左闭右开
3.2 for循环守卫
基本案例:
for(i <- 1 to 3 if i !=2){
print(i+" ")
}
说明:
- 循环守卫,即循环保护式,保护式为true进入循环体,false则跳过
- 类似于continue
- 等价于这种写法
for(i <- 1 to 3 ){
if(i !=2){
print(i+" ")
}
}
3.3 引入变量
基本案例:
for(i <- 1 to 3 ; j = 4-i){
print(i+" ")
}
说明:
- 没有关键字,所以范围后面要加
;
- 等价于这种写法
for(i <- 1 to 3){
val j = 4-i
print(i+" ")
}
3.4 嵌套循环
基本案例:
for(i <- 1 to 3 ; j <- 1 to 3){
print(i+" ")
}
说明:
- 没有关键字,加
;
- 等价于这种写法
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)
说明:
- 将遍历过程中处理的结果返回到一个新的vector集合中,使用
yield
关键字 - 含义:
- 对 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
}
注意:
- 循环条件是返回一个布尔值的表达式
- while循环是先判断后执行语句
- 与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名同学,求出各个班的平均分和所有班级的平均分
思路:
- classNum 表示班级个数,stuNum 表示学生个数
- classScore 表示各个班级的总分,totalScore 表示所有班级的总分
- score 表示个人的分
- 使用循环的方式输入成绩
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()
}