for
expressions can nest, with later generators varying more rapidly than earlier ones:
val xValues = 1 to 4
val yValues = 1 to 2
val coordinates = for {
x <- xValues
y <- yValues
} yield (x, y)
coordinates(4) should be((res0, res1))
Using for
we can make more readable code:
val nums = List(List(1), List(2), List(3), List(4), List(5))
val result = for {
numList <- nums
num <- numList
if (num % 2 == 0)
} yield (num)
result should be(res0)
// Which is the same as
nums.flatMap(numList => numList).filter(_ % 2 == 0) should be(result)
// or the same as
nums.flatten.filter(_ % 2 == 0) should be(result)