For 循环控制
Scala 为 for 循环这一常见的控制结构提供了非常多的特性,这些 for 循环的特性被称为 for 推导式或 for 表达式。
目录
一、范围遍历
二、集合遍历
三、循环守卫
四、循环步长
五、嵌套循环
六、引入变量
七、循环返回值
一、范围遍历
package chapter04
object Test02_Forloop {
def main(args: Array[String]): Unit = {
//带着编号输出10次hello word
//java for语法:for(int i = 0 ;i < 10 ;i++){System.out.println(i+"hello word")}
//1.范围遍历
for(i <- 1 to 10){ //从一到十
println(i+".hello word")
}
//本质是这样的,调用了1的.to()方法
//但是对象的调用可以省略点 用空格代替 类型int也省略了
// 1.to(10) 表示的是创建了这样一个类型(Range---集合类型)的对象 for循环遍历的就是这个对象里的元素
for(i :Int <- 1.to(10)){
println(i+".hello word") //to 输出 1到10 包括1和10
}
println("===================")
//不包含边际的遍历
for (i<- Range(1,10)){
println(i+".hello word") //Range对象 输出 1到9 包括1和9
}
println("===================")
for (i <- 1 until 10){
println(i+".hello word") //until 到十结束 不包含10 输出1到9
}
}
}
二、集合遍历
//2.集合遍历
// to 和 until 本质是创建了一个range range本身又是一个集合类型
// 所以这里不创建range,使用其他集合 比如 Array List Set
for (i <- Array(12,34,45)){
println(i)
}
for (i <- List(12,34,45)){
println(i)
}
for (i <- Set(12,34,45)){
println(i)
}
三、循环守卫
循环守卫,即循环保护式(也称条件判断式,守卫)。保护式为 true 则进入循环体内部,为false 则跳过,类似于continue。
//3.循环守卫
for (i <- 1 to 10){
if (i != 5){
println(i)
}
}
//等价于
for (i <- 1 to 10 if i != 5){
println(i) // 1 2 3 4 6 7 8 9 10
}
}
}
四、循环步长
//4.循环步长
for (i <- 1 to 10 by 2){ //(i <- (1 to 10).by(2) ) 方法调用空格空开 ,参数只有一个省略括号
println(i)
}
for(i <- 13 to 30 by 3){
println(i)
}
// 13------->30 by -3 步长为负 不输出结果
println("-------------------")
//如果start值设置为比end小 步长可以为负
for(i <- 30 to 13 by -3){
println(i) //倒叙输出
}
//从十到一
for (i <- 10 to 1 by -1){
println(i)
}
for (i <- 10 to 1 reverse ){ //reverse 反转 ----》原码里就是上面的意思
println(i)
}
//步长为0 是会报异常的
//走半步:
//从十到一
for (i <- 1.0 to 10.0 by 0.5 ){ //把start和end变成double类型 步长就可以设置为小数
println(i)
}
五、嵌套循环
//5.循环嵌套
//类似于java的写法
for(i <- 1 to 3){
for (j <- 1 to 3){
println("i= "+i +" , "+ "j="+j )
}
}
//scala 提供了比较简洁的写法 用 ;分隔
println("----------------------")
for(i <- 1 to 4 ; j <- 1 to 5 ){
println("i= "+i +" , "+ "j="+j )
}
六、引入变量
for 推导式一行中有多个表达式时,所以要加 ; 来隔断逻辑
for(i <- 1 to 3; j = 4 - i) {
println("i=" + i + " j=" + j)
}
for 推导式有一个不成文的约定:当 for 推导式仅包含单一表达式时使用圆括号, 当包含多个表达式时,一般每行一个表达式,并用花括号代替圆括号
//6.循环引入变量
for (i <- 1 to 10 ){
val j = 10 -i
println("i= "+i +" , "+ "j="+j )
}
println("-----------------")
for (i <- 1 to 10 ;j = 10 -i ){ //j不是从集合里取值的,而是直接定义出来的
println("i= "+i +" , "+ "j="+j )
}
//写成多行 用花括号
for {
i <- 1 to 10
j = 10 -i }
{
println("i= " + i + " , " + "j=" + j)
}
七、循环返回值
scala里for循环的默认返回值是unit
val a :Unit = for (i <- 1 to 10){
println(i)
}
println("a="+a) //a=()
}
}
将遍历过程中处理的结果返回到一个新 Vector 集合中,使用 yield 关键字。
//7.循环返回值
val a :Unit = for (i <- 1 to 10){
println(i)
}
println("a="+a) //a=()
//val ints: immutable.Seq[Int] = for (i <- 1 to 10) yield i //.var自动补全类型
//val b = ints
val b = for (i <- 1 to 10) yield i
println("b="+b) //b=Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 生成向量类,集合类型
//将原数据中所有值乘以 2,并把数据返回到一个新的集合中。
val c = for (i <- 1 to 10) yield i*2
println("c="+c)