관리자

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))

+ Recent posts