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))
'언어 > Scala' 카테고리의 다른 글
scala for comprehension, for {...} yield (0) | 2020.02.03 |
---|---|
type / class 확인하기 (0) | 2020.01.26 |
for loop/ for() /for{} /for(...) yield (0) | 2020.01.26 |
set 1.2.8 실행 오류 / sbt 1.2.8 can not execute / sbt Java.io.ioerror: java.lang.runtimeexception: /packages cannot be represented as URI (0) | 2020.01.26 |
원소 숫자 세기 : count number of elements (0) | 2020.01.24 |