Scala之旅-For Comprehensions

Scala之旅-For Comprehensions

For Comprehensions

Scala为表达sequence comprehensions提供了一个轻量级表示方法。Comprehensions的形式是for (enumerators) yield e,enumerators表示分号分隔的枚举成员列表。枚举器或者是引入新变量的生成器,或者是过滤器。comprehension为每个由enumerators生成的元素计算e,并返回这些值的序列。

下面是一个例子:

case class User(val name: String, val age: Int)

val userBase = List(new User("Travis", 28),
  new User("Kelly", 33),
  new User("Jennifer", 44),
  new User("Dennis", 23))

val twentySomethings = for (user <- userBase if (user.age >=20 && user.age < 30))
  yield user.name  // i.e. add this to a list

twentySomethings.foreach(name => println(name))  // prints Travis Dennis

带有yield语句的for循环会生成一个List。yield user.name会得到一个List[String]user <- userBase是生成器,if (user.age >=20 && user.age < 30)过滤出了20多岁的users。

下面是一个使用两个生成器的更复杂的例子。它计算所有在0和n-1之间的数对,数对的和等于给定的值v:

def foo(n: Int, v: Int) =
   for (i <- 0 until n;
        j <- i until n if i + j == v)
   yield (i, j)

foo(10, 10) foreach {
  case (i, j) =>
    print(s"($i, $j) ")  // prints (1, 9) (2, 8) (3, 7) (4, 6) (5, 5)
}

这里n == 10并且v == 10。在第一次循环,i == 0并且j == 0,所以i + j != v,因此不会有产出。在i增加到1之前,j有9次增加。如果没有if条件,将会打印如下结果:

(0, 0) (0, 1) (0, 2) (0, 3) (0, 4) (0, 5) (0, 6) (0, 7) (0, 8) (0, 9) (1, 1) ...

参考资料

本文译自Tour Of Scala – For Comprehensions

上一篇:Scala之旅-Extractor对象

下一篇:Scala之旅-泛型类

发表评论

电子邮件地址不会被公开。 必填项已用*标注