循环
注意:scala没有++这个操作符
scala> val s = "hello123";
s: String = hello123
scala> for (c <- s) println(c)
for里面的就是把s遍历出来的元素赋值给c
<- 规定 to, 前后闭合
表达式1-10循环
for (i <- 1 to 10)
println(i)
循环数组
# val arr = Array[String](_"a"_ "b"_ "c")
val arr = Array("a", "b", "c")
for (i <- arr)
println(i)
高级循环,带if
每个生成器都可以带一个条件,注意: if前面没有分号
for (i <- 1 to 3 if i != 2) {
println(i + " ")
}
// 类似
for (i <- 1 to 3) {
if (i != 2) {
println(i + " ")
}
}
循环步长
by表示步长
for (i <- 1 to 10 by 2) {
println(i + " ")
}
嵌套循环
没有关键字,所以范围后一定要加;来隔断逻辑
for (i <- 1 to 3; j <- 1 to 3) {
println("i = " + i + " j = " + j)
}
//类似
for (i <- 1 to 3) {
for (j <- 1 to 3) {
println("i = " + i + " j = " + j)
}
}
引入变量
for (i <- 1 to 3; j = 4 -i) {
println("i = " + i + " j = " + j)
}
输出
i = 1 j = 3
i = 2 j = 2
i = 3 j = 1
- for 推导式一行中有多个表达式时,所以要加 ;来隔断逻辑
- for 推导式有一个不成文的约定:当 for 推导式仅包含单一表达式时使用圆括号, 当包含多个表达式时,一般每行一个表达式,并用花括号代替圆括号,如下 ```scala 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) }
<a name="CWt6P"></a>
## 倒叙打印
如果想倒序打印一组数据,可以用 reverse
```scala
for (i <- 1 to 3 reverse) {
println("i = " + i)
}
for推导式, yield
如果for循环的循环体以yield开始,则该循环会构建出一个集合
每次迭代生成集合中的一个值
将遍历过程中处理的结果返回到一个新 Vector 集合中,使用 yield 关键字。
在Scala中for循环是和yield一起使用的,他的形式是for (enumerators) yield e。 此处 enumerators 指一组以分号分隔的枚举器。这里的enumerator 要么是一个产生新变量的生成器,要么是一个过滤器。for 表达式在枚举器产生的每一次绑定中都会计算 e 值,并在循环结束后返回这些值组成的序列
val v = for (i <- 1 to 10) yield i * 10
println(v)
Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
util包左不包右
val a = Array("a", "b", "c")
for(i <- 0 util a.length) println(a(i))
//这种方式和前面的区别在于 i 是从 1 到 3-1
for (i <- 1 until 3) {
println(i + " ")
}
while循环中断
Scala 内置控制结构特地去掉了break和continue,是为了更好的适应函数式编程,推 荐使用函数式的风格解决 break 和 continue 的功能,而不是一个关键字。Scala 中使用 breakable 控制结构来实现 break 和 continue 功能。
import scala.util.control.Breaks
val loop = new Breaks
var n = 1
loop.breakable{
while(n<=20) {
n+=1;
println(n)
if(n == 18) {
loop.break()
}
}
}
for循环中断
import scala.util.control.Breaks
Breaks.breakable(
for (i <- 1 to 10) {
println("i = " + i)
if (i == 5) Breaks.break()
}
)
对break进行省略
import scala.util.control.Breaks._
breakable(
for (i <- 1 to 10) {
println("i = " + i)
if (i == 5) break()
}
)
continue
for(i<-0 until 10){
breakable{
if(i==3||i==6) {
break
}
println(i)
}
}
//0,1,2,3,5,7,8,9
多重while循环
import scala.util.control.Breaks
val loop1 = new Breaks
val loop2 = new Breaks
var count = 1
loop1.breakable {
while (true) {
count += 1
println(count)
if (count == 10) {
loop1.break()
}
loop2.breakable {
while (true) {
println(count)
count += 1
if (count == 20) {
loop2.break()
}
}
}
}
}
迭代修改值
val list = List((1, "a"), (2, "a"), (3, "c"))
val list2 = list.map { case (a, b) => (a + 1, b + "zy") }
println(list2)