开发者学堂课程【Scala 核心编程-基础:循环的注意事项和练习题】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8920
循环的注意事项和练习题
目录
一、for 循环控制
二、for 循环练习题
一、for 循环控制
1、循环返回值
val res = for(i<-1 to 10)yield { //语法底层是反过来调的,在 yield 中是可以接收一段代码块的if(i % 2 == 0) {
i
}else{
“不是偶数”
}
println(res)
}
}
2、语法现象
在 for 循环里,可以使用花括号{}代替小括号()
(1)基本案例:for(i<-1 to 3;j=i*2) {
println(“i=”+i+“j=”+j)
}
可以写成
for{i<-1 to 3
j=i*2}{
println(“i=”+i+”j=”+j)
}
3、对本案例说明
(1){}和()对于 for 表达式来说都可以
(2)for 推导式有一个不成文的约定:当 for 推导式仅包含单一表达式时使用圆括号,当其包含多个表达式时使用大括号
(3)当使用{}来换行写表达式时,分号就不用写了
4、代码演示
package com.atguigu.chapter04.myfor
object usefor2 {
def main(args: Array[String]): Unit = {
for (i <-1 to 3;j=i*2){
println("i="+i+"j="+j)
}
//等价
println("------------------------")
for {
i <-1 to 3
j= i * 2}{
println("i="+i+"j="+j)
}
}
}
运行结果显示为:
两种形式结果完全一样
5、注意事项和细节说明
(1)scala 的 for 循环形式和 java 是较大差异,这点需要注意,但是基本的原理还是一样的。
(2)scala 的 for 循环的步长如何控制![for(i<-Range(1,3,2)]
(3)思考题:如何使用循环守卫控制步长
例子:
for(i<-start to end) { //默认为增1
i += 1 //使用不了,在 scala 中,它认为 i 默认为 val 类型,所以是无法改变的。
① 控制范围的步长示例1:package com.atguigu.chapter04.myfor
object stepfor {def main(args:Array[String]):Unit = {for(i<- 1 to 10){println(“i=”+ i) //步长默认为1
}
//步长控制为2
println(“-------------”)
for(i<- Range(1,10,2))
println(“i=”+i)
}}
运行结果效果如下:
观察步长是如何被控制的。选中“range”并输入 ctrl+b,进入界面,发现此代码:type Range = scala.collection.immutable.Range
val Range = scala.collection.immutable.Range //可以发现它是一个集合。Immutable 是不可变的意思。
object 提供了一个 apply 的方法:
def apply(start:Int,end:Int,step:Int):Range = new Range(start,end,step) //apply 是可以省略一个 new,创建一个对象。触发 apply,apply 会 new 出 Range,传了 start,end,step 三个参数。
//Range(1,10,2)的对应的构建方法是 def apply(start:Int,
end:Int,step:Int):Range = new Range(start,end,step)
② 控制步长的第二种方式
使用 for 循环的守卫来实现控制步长
println(“*****************”) //增加间隔
for(i<- 1 to 10 if i % 2 == 1) {println(“i=”+i)
}
输出结果如下:
输出结果正确,因为 i 在执行时会看条件是否成立。
循环守卫还可以实现 break 的效果。
二、for 循环练习题
1、打印1~100之间所有是9的倍数的整数的个数及总和
案例:package com.atguigu.chapter04.myfor
object ForExercise01 {
def main(args:Array[String]):Unit = {
val start = 1 //定义范围
val end = 100
var count = 0 //定义变量
var sum = 0
for(i<-start to end){ //遍历
if (i % 9 == 0){ //加入判断,如果 i 模9等于0
count += 1
sum += i
printf(“count=%d,sum=%d\n”,count,sum) //输出
运行效果如下:
2、完成下面表达式输出
0 + 6 = 6
1 + 5 = 6
2 + 4 = 6
3 + 3 = 6
5 + 1 = 6
6 + 0 = 0
案例:
//输出加法的循环表达式
val num = 6 //定义一个值,默认为6
for(i<- 0 to num) { //for 循环开始,i 从0到num
println(“%d + %d = %d\n”,i,(num - i),num)
}
输出效果如下:




