for循环的几种方式
第一种(生成器表达式)
- i 表示循环的变量, <- 规定好 to 规定
- i 将会从 1-3 循环, 前后闭合
for(i <- 1 to 3){
print(i + " ")
}
第二种
- 这种方式和前面的区别在于 i 是从1 到 3-1
- 前闭合后开的范围,和java的arr.length() 类似
for(i <- 1 until 3) {
print(i + " ")
}
第三种(守卫)
for(i <- 1 to 3 if i != 2) {
print(i + " ")
}
这个代码等价于
for (i <- 1 to 3) {
if (i != 2) {
println(i+"")
}
}
第四种(引入变量)
for(i <- 1 to 3; j = 4 - i) {
print(j + " ")
}
没有关键字,所以范围后一定要加;来隔断逻辑
上面的代码等价
for ( i <- 1 to 3) {
val j = 4 –i
print(j+"")
}
第五种(嵌套循环)
for(i <- 1 to 3; j <- 1 to 3) {
println(" i =" + i + " j = " + j)
}
上面的代码等价于
for ( i <- 1 to 3) {
for ( j <- 1to 3){
println(i + " " + j + " ")
}
}
第六种(循环返回值)
将遍历过程中处理的结果返回到一个新Vector集合中,使用yield关键字
val res = for(i <- 1 to 10) yield i
println(res)
第七种(用花括号代替小括号)
- {}和()对于for表达式来说都可以
- for 推导式有一个不成文的约定:当for 推导式仅包含单一表达式时使用圆括号,当其包含多个表达式时使用大括号
- 当使用{} 来换行写表达式时,分号就不用写了
for(i <- 1 to 3; j = i * 2) {
println(" i= " + i + " j= " + j)
}
注意
- scala中去掉了break和continue,所以需要专门的中断语句去执行
- break()函数替代break,用breakable()将代码块包起来,可以让break()函数后的代码可以继续执行
- 循环守卫替代continue
import util.control.Breaks._
/**
* @author:
* @date:
* @version 1.0
*/
object Demo9 {
var n = 1;
while (true){
n += 1
if (n === 18){
//在scala中使用函数式的break函数中断循环
//def break(): Nothing = { throw breakException }
//这样就导致后面的代码不会被执行,这时可以用breakable去处理
break();
}
}
}
import util.control.Breaks._
object WhileBreak {
def main(args: Array[String]): Unit = {
var n = 1
//breakable()函数
//说明
//1. breakable 是一个高阶函数:可以接收函数的函数就是高阶函数
//2. def breakable(op: => Unit) {
// try {
// op
// } catch {
// case ex: BreakControl =>
// if (ex ne breakException) throw ex
// }
// }
// (1) op: => Unit 表示接收的参数是一个没有输入,也没有返回值的函数
// (2) 即可以简单理解可以接收一段代码块
// 3. breakable 对break()抛出的异常做了处理,代码就继续执行
// 4. 当我们传入的是代码块,scala程序员会将() 改成{}
breakable {
while (n <= 20) {
n += 1
println("n=" + n)
if (n == 18) {
//中断while
//说明
//1. 在scala中使用函数式的break函数中断循环
//2. def break(): Nothing = { throw breakException }
break()
}
}
}
println("ok~~")
}
}
//使用循环守卫终端
var loop = true
var sum2 = 0
for (i <- 1 to 100 if loop == true) {
sum2 += i
if (sum2 > 20) {
println("循环守卫实现中断 第一次大于20的当前数=" + i)
loop = false
}
println("i=" + i)
}
总结
- scala 的for循环形式和java是较大差异,这点请注意,但是基本的原理还是一样的。
- scala 的for循环的步长如何控制! [for(i <- Range(1,3,2)] [for (i <- 1 to 10 by 2)]
- 思考题:如何使用循环守卫控制步长
for (i <- Range(1,10,2)){
println(s"i=${i}")
}
//控制步长的第二种方式-for循环守卫
for (i <- 1 to 10 if i % 2 == 1) {
println("i=" + i)
}
for (i <- 1 to 10 by 2) {
println("i=" + i)
}