for comprehension
for comprehension是一种用于创建新集合的for表达式
Scala提供了轻量级符号来表示序列理解(sequence comprehensions)。理解具有形式for (enumerators) yield e,此处的enumerators指的是分号间隔的枚举器列表。枚举器表示引入新变量的生成器,或过滤器。理解计算通过枚举器生成的每个绑定的主体e,并且返回这些值的序列。
case class User(name: String, age: Int)
val userBase = List(User("Travis", 28),
User("Kelly", 33),
User("Jennifer", 44),
User("Dennis", 23))
val twentySomethings = for (user <- userBase if (user.age >=20 && user.age < 30))
yield user.name
note:伴随yield的for循环创建了List。
note:user <- userBase是生成器。
note: if(user.age >= 20 && user.age < 20)是护卫,将非20s的用户过滤。
def foo(n: Int, v: Int) =
for (i <- 0 until n;
j <- i until n if i + j == v)
yield (i, j)
note:生成二元组,二元组内元素的值位于0到n-1之间,并且两元素和为v。
理解并不仅限于列表,每个支持withFilter、map与flatMap操作的数据类型都可以被用于序列理解。
可以忽略理解中的yield,在这种情况下,理解返回Unit。
忽略yield
def foo(n:Int, v:Int) =
for (i <- 0 until n; j <- i until n if i + j == v)
println(s"($i, $j)")