Scala 中 while 和 do...while 循环同 Java 一致,这里不过多介绍,本文着重介绍For循环控制。
目录
一、范围数据循环(To)
1.1 基本语法
for(i <- 1 to 3){
print(i + " ")
}
println()
(
1
)
i
表示循环的变量,
<-
规定
to
(
2
)
i
将会从
1-3
循环,
前后闭合
1.2 案例
输出5遍“I love you”
object TestFor {
def main(args: Array[String]): Unit = {
for(i <- 1 to 5){
println("I love you")
}
}
}
二、范围数据循环(Until)
2.1 基本语法
for(i <- 1 until 3){
print(i + " ")
}
println()
(
1
)这种方式和前面的区别在于
i
是从
1
到
3-1
(
2
)即取值为
前闭合后开
的范围
2.2 案例
输出5遍“I love you”
object TestFor {
def main(args: Array[String]): Unit = {
for(i <- 1 until 5+1){
println("I love you")
}
}
}
三、循环守卫
3.1 基本语法
for(i <- 1 to 3 if i != 2){
print(i + " ")
}
println()
说明:
(1
)循环守卫,即循环保护式(也称条件判断式,守卫)。保护式为
true
则进入循环
体内部,为
false
则跳过,类似于
continue
。
(2
)上面的代码等价
for(i <- 1 to 3){
if(i !=2){
print(i + " ")
}
}
println()
3.2 案例
输出1到10中不是3的倍数的值
object TestFor {
def main(args: Array[String]): Unit = {
for(i <- 1 to 10 if i%3 != 0){
println(i)
}
}
}
四、循环步长
4.1 基本语法
for(i <- 1 to 10 by 2){
println(s"i=${i}")
}
说明:by表示步长
4.2 案例
输出1到10以内的所有奇数
object TestFor {
def main(args: Array[String]): Unit = {
for(i <- 1 to 10 by 2){
println(s"i=${i}")
}
}
}
五、嵌套循环
5.1 基本语法
for(i <- 1 to 3; j <- 1 to 3){
println(s"i=${i} j=${j}")
}
说明:没有关键字,所以范围后一定要加
;
来隔断逻辑
上面代码等价于
for(i <- 1 to 3){
for(j <- 1 to 3){
println(s"i=${i} j=${j}")
}
}
5.2 案例
控制台输出九九乘法表
object TestFor {
def main(args: Array[String]): Unit = {
for(i <- 1 to 9; j <- 1 to i){
print(s"${i}*${j}=${i*j}\t")
if(i == j) println()
}
}
}
六、引入变量
6.1 基本语法
for(i <- 1 to 3; j = 4 - i){
println(s"i=${i} j=${j}")
}
说明:
(
1
)
for
推导式一行中有多个表达式时,所以要加
;
来隔断逻辑
(
2
)
for
推导式有一个不成文的约定:当
for
推导式仅包含单一表达式时使用圆括号,当包含多个表达式时,一般每行一个表达式,并用花括号代替圆括号,如下
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)
}
七、循环返回值
7.1 基本语法
val res = for(i <- 1 to 10) yield i
println(res)
说明:将遍历过程中处理的结果返回到一个新
Vector
集合中,使用
yield
关键字。
注意:开发中很少使用。
7.2 案例
将原数据中所有值乘以 2,并把数据返回到一个新的集合中。
object TestFor {
def main(args: Array[String]): Unit = {
val res = for(i <- 1 to 10) yield {
i * 2
}
println(res)
//res类型为vector集合容器
println(res.getClass.getName)
}
}
八、倒序打印
8.1 基本语法
for(i <- 1 to 10 reverse){
println(i)
}
九、循环中断
9.1 基本说明
Scala 内置控制结构特地
去掉了 break 和 continue
,是为了更好的适应
函数式编程
,推荐使用函数式的风格解决break
和
continue
的功能,而不是一个关键字。
Scala
中使用
breakable控制结构来实现 break
和
continue
功能。
9.2 案例
需求1:采用异常的方式退出循环
object TestFor {
def main(args: Array[String]): Unit = {
try {
for (elem <- 1 to 10) {
println(elem)
if (elem == 5) throw new RuntimeException
}
}catch {
case e =>
}
println("正常结束循环")
}
}
需求 2:采用 Scala 自带的函数,退出循环
import scala.util.control.Breaks
object TestBreak {
def main(args: Array[String]): Unit = {
Breaks.breakable(
for (elem <- 1 to 10) {
println(elem)
if (elem == 5) Breaks.break()
}
)
println("正常结束循环")
}
}
需求 3
:对
break 进行省略
import scala.util.control.Breaks._
object TestBreak {
def main(args: Array[String]): Unit = {
breakable {
for (elem <- 1 to 10) {
println(elem)
if (elem == 5) break
}
}
println("正常结束循环")
}
}
需求 4
:循环遍历
10
以内的所有数据,奇数打印,偶数跳过(
continue
)
object TestBreak { def main(args: Array[String]): Unit = { for (elem <- 1 to 10) { if (elem % 2 == 1) { println(elem) } else { println("continue") } } } }