scala에서는 for {}를 통해 중첩 for문을 만들 수 있다.
단순히 여러 조건을 나열하는게 아니라
line마다 새로운 loop가 생긴다.
scala documentation에 따르면 for ... yield는 foreach, map, flatMap, filter or withFilter의 syntatic sugar일 뿐이다.
즉, foreach, map, flatMap, withFilter를 좀 더 편리하게 풀어쓴 것뿐이다.
취소선으로 표시한 부분은 좀 더 실험을 해봐야겠다.
1. for { 1 줄 } yield
val t = for {
e1 <- 1 to 3
} yield {
e1
}
def main(args: Array[String]) {
println(t)
}
// result
// Vector(1, 2, 3)
2. for { 2줄 } yield
for는 한번만 작성했지만, nested for loop같은 결과가 나오는 것을 확인할 수 있다.
generate되는 순서도 우리가 생각하는 for문과 동일하다!
새로운 line마다 새로운 for loop가 시작되는 것처럼,
첫번째 line이 outer loop이고, 아래로 갈수록 inner loop이다.
val t = for {
e1 <- 1 to 3
e2 <- List('a', 'b', 'c', 'd')
} yield {
(e1, e2)
}
def main(args: Array[String]) {
println(t)
}
// result
// Vector((1,a), (1,b), (1,c), (1,d), (2,a), (2,b), (2,c), (2,d), (3,a), (3,b), (3,c), (3,d))
3. for { 3 줄 } yield
yield의 값이 (e1,e2)로 2번과 동일하지만, 결과는 2배로 길어진 것을 확인할 수 있다.
val t = for {
e1 <- 1 to 3
e2 <- List('a', 'b', 'c', 'd')
e3 <- List('Z', 'X')
} yield {
(e1, e2)
}
def main(args: Array[String]) {
println(t)
}
// result
// Vector((1,a), (1,a), (1,b), (1,b), (1,c), (1,c), (1,d), (1,d), (2,a), (2,a), (2,b), (2,b), (2,c), (2,c), (2,d), (2,d), (3,a), (3,a), (3,b), (3,b), (3,c), (3,c), (3,d), (3,d))