开发者学堂课程【Scala 核心编程-基础:循环的注意事项和练习题】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8920
循环的注意事项和练习题
目录
一、for 循环控制
二、for 循环练习题
一、for 循环控制
1、循环返回值
val res = for(i<-1 to 10)yield { //
语法底层是反过来调的,在 y
ield
中是可以接收一
段
代码块的
if(i % 2 == 0) {
i
}
else{
“
不是偶数
”
}
println
(res)
}
}
2、语法现象
在 for 循环里,可以使用花括号{}代替小括号()
(1)基本案例:for(i<-1 to 3;j=i*2) {
print
l
n(
“
i=
”
+i+
“
j=”+j)
}
可以写成
f
or{
i<-1 to 3
j
=i*2}{
p
rintln(“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){
print
l
n("i="+i+"j="+j)
}
//等价
p
rint
l
n
(
"------------------------"
)
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
o
bject stepfor {
def main(args:Array[String]):Unit = {
for(i<- 1 to 10){
println(“i=”+ i)
//步长默认为1
}
//步长控制为2
p
rintln(“-------------”)
f
or(i<-
Range(1
,
10
,
2))
p
rintln(“i=”+i)
}
}
运行结果效果如下:
观察步长是如何被控制的。选中“range”并输入 ctrl+b,进入界面,发现此代码:type Range = scala.collection.immutable.Range
v
al 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(“*****************”) //增加间隔
f
or(i<- 1 to 10 if i % 2 == 1) {
println(“i=”+i)
}
输出结果如下:
输出结果正确,因为 i 在执行时会看条件是否成立。
循环守卫还可以实现 break 的效果。
二、for 循环练习题
1、打印1~100之间所有是9的倍数的整数的个数及总和
案例:package com.atguigu.chapter04.myfor
o
bject ForExercise01 {
def main(args:Array[String]):Unit = {
v
al start = 1
//定义范围
v
a
l
end = 100
var count = 0
//定义变量
var sum = 0
f
or(i<-start to end){
//遍历
if (i
%
9
==
0){
//加入判断,如果 i 模9等于0
c
ount += 1
s
um += i
print
f
(“c
ount=%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)
}
输出效果如下: