scala for表达式是枚举操作的 “利器”, 它可以让你用不同的方式把若干简单的成分组合起来表达各种各样的枚举。 简单使用适合于通常的任务, 例如枚举整数序列。 高级表示可以同时枚举不同类型的多个集合,可以用任意条件过滤元素, 还可以制造新的集合。
枚举集合类
例如实现一个1到3的Range序列遍历:
scala> 1 to 3
res7: scala.collection.immutable.Range.Inclusive = Range 1 to 3
scala> for ( i <- 1 to 3){
| println("iteration " + i)
| }
iteration 1
iteration 2
iteration 3
如果不想包括被枚举的Range的上边界, 可以用 until 替代 to:
scala> 1 until 3
res8: scala.collection.immutable.Range = Range 1 until 3
scala> for ( i <- 1 until 3){
| println("iteration " + i)
| }
iteration 1
iteration 2
<- 符号右侧的表达式可以是具有foreach方法的任意类型
可以查看到 Range foreach 实现的源码
@inline final override def foreach[@specialized(Unit) U](f: Int => U) {
// Implementation chosen on the basis of favorable microbenchmarks
// Note--initialization catches step == 0 so we don't need to here
if (!isEmpty) {
var i = start
while (true) {
f(i)
if (i == lastElement) return
i += step
}
}
}
过滤(for循环筛选)
for 循环过滤是以 变量<-表达式 生成的生成器后面带一个守卫, 以if 开头的Boolean表达式。
scala> for ( i <- 1 to 3 if i%2 != 0 ){ // 单条件过滤
| println("iteration " + i)
| }
iteration 1
iteration 3
scala> for ( i <- 1 to 5 if i%2 != 0; if i != 3 ){ // 多条件过滤
| println("iteration " + i)
| }
iteration 1
iteration 5
枚举嵌套(for循环嵌套)
for 循环嵌套是以 变量<-表达式 的形式提供多个生成器, 用分号分开;每个生成器后面也可以添加对应的守卫。
scala> for( i <- 1 to 5 if i%2 != 0;
| j <- 1 to 5 if j%2 == 0 ){ // 类似于 C++ 和 java中的两层 for 循环嵌套语句
| println( i + " * " + j + " = " + i*j)
| }
1 * 2 = 2
1 * 4 = 4
3 * 2 = 6
3 * 4 = 12
5 * 2 = 10
5 * 4 = 20
创建集合 (for 推导式)
for-yield 表达语法 for {} yield {}, 注意放置yield关键字的位置
scala> val data = for( i <- 1 to 5 ) yield i
data: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5)
scala> val data = for( i <- 1 to 5 ){ yield i} // 这种使用方式是错误的注意for-yield 语法
<console>:1: error: illegal start of statement
val data = for( i <- 1 to 5 ){ yield i}
^
scala> val data = for { i <- 1 to 5
| if i%2 != 0
| j <- 10 until 11
| sum = i+j } // sum 是在for表示式中半路引入的变量,可以在 yield 中间被使用
| yield { sum }
data: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 13, 15)