Scala 提供了一个轻量级的 for 来表达序列的理解。理解从 for (enumerators) yield e
结构开始,enumerators
指得是一个分号分隔列表的迭代。每次迭代既会产生一个新变量,又是一个过滤器。 e
的理解就是迭代中的每一个序列中的值。
这段不是很理解,所以帖出原文,希望指正
Scala offers a lightweight notation for expressing sequence comprehensions. Comprehensions have the form for (enumerators) yield e, where enumerators refers to a semicolon-separated list of enumerators. An enumerator is either a generator which introduces new variables, or it is a filter. A comprehension evaluates the body e for each binding generated by the enumerators and returns a sequence of these values.
这里有一个例子:
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多岁。
这里有一个更加复杂的例子,它使用了两个迭代器。计算了所有在 0
到 n-1
之间和等于 v
的组合。