순차적인 자료들을 다루기 위한 for문 사용을 제공
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 // i.e. add this to a list
twentySomethings.foreach(println) // prints Travis Dennis
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 // i.e. add this to a list
twentySomethings.foreach(println) // prints Travis Dennis
for문에서 yield e를 반환하게된다.
user <- userBase
: enumerate ⇒ userbase에서 user를 하나씩 뽑아내서 쓰는 generator
yield 문과 함께 list로 반환한다. / 최종 결과는 List[String]
이다.
if user.age >=20 && user.age < 30
: filter 조건문
제너레이터를 두개를 써서 좀 더 복잡한 예시가 있다.
def foo(n: Int, v: Int) =
for i <- 0 until n
j <- 0 until n if i + j == v
yield (i, j)
foo(10, 10).foreach {
(i, j) => println(s"($i, $j) ") // prints (1, 9) (2, 8) (3, 7) (4, 6) (5, 5) (6, 4) (7, 3) (8, 2) (9, 1)
}
→ 보통 일반적으로 for문을 중첩으로 돌려야 하는데 스칼라에서는 위같이 표현 가능하다.
scala2에서는 세미콜론으로 복수의 제너레이터를 구분한다.
for 문은 리스트에서만 쓸 수 있는 것은 아니다.
yield문을 생략할 수 있는데 이때는 unit을 반환한다. → 이는 사이드 이펙트 처리로 화면에 단순히 출력하고자할때 유용하다.