for 루프
- for 내장(comprehension) 또는 for 식(expression)이라고 부른다.
val dogBreeds = List("Doberman", "Yorkshire Terrier", "Dachshund",
"Scottish Terrier", "Great Dane", "Portuguese Water Dog")
for (breed <- dogBreeds)
println(breed)
- dobBreeds 리스트의 모든 원소에 대해 값을 저장할 breed라는 임시 변수를 만들고 출력한다는 코드이다.
제너레이터 식
- 컬렉션에서 개별 값을 생성해내므로 붙은 이름이다.
- '<-'는 List와 같은 컬렉션을 순회하기 위해 사용한다.
for (i <- 1 to 10) println(i)
가드: 값 걸러내기
- if 식을 추가해서 원소를 걸러내고 원소만 남길 수 있다.
- 이런식을 가드라고 한다.
val dogBreeds = List("Doberman", "YorkShire Terrier", "dachshund",
"Scottish Terrier", "Great Dane", "Portugese Water Dog")
for (breed <- dogBreeds
if breed.contains("Terrier")
) println(breed)
val dogBreeds = List("Doberman", "YorkShire Terrier", "dachshund",
"Scottish Terrier", "Great Dane", "Portugese Water Dog")
for (breed <- dogBreeds
if breed.contains("Terrier")
if !breed.startsWith("Yorkshire")
) println(breed)
for (breed <- dogBreeds
if breed.contains("Terrier") && !breed.startsWith("Yorkshire")
) println(breed)
yield로 값 만들어내기
- 걸러낸 컬렉션의 결과를 모아서 넘길 때는 yield 키워들르 이용해서 for 식으로 새로운 컬렉션을 만든다.
val dogBreeds = List("Doberman", "YorkShire Terrier", "dachshund",
"Scottish Terrier", "Great Dane", "Portugese Water Dog")
val filteredBreeds = for {
breed <- dogBreeds
if breed.contains("Terrier") && !breed.startsWith("Yorkshire")
} yield breed
- for 식을 매번 반복하면서 걸러낸 결과를 breed라는 이름의 값으로 만들어낸다.
- 이 결과는 매 루프마다 누적되며, 결과 컬렉션은 filteredBreeds라는 값에 저장된다.
확장 영역과 값 정의
val dogBreeds = List(Some("Doberman"), None, Some("Yorkshire Terrier"),
Some("Dachshund"), None, Some("Scottish Terrier"),
None, Some("Great Dane"), Some("Portuguese Water Dog"))
println("first pass:")
for {
breedOption <- dogBreeds
breed <- breedOption
upcasedBreed = breed.toUpperCase()
} println(upcasedBreed)
println("second pass:")
for {
Some(breed) <- dogBreeds
upcasedBreed = breed.toUpperCase()
} println(upcasedBreed)
- 첫 for 내장의 첫번째 식에서 뽑아낸 원소는 Option이다.
- 그다음 줄에서는 화살표를 사용해서 Option에 들어 있는 값을 빼낸다.
- for 내장에서는 None 처리를 건너뛰기 때문에 None에서 값을 빼내는 일은 생각하지 않아도 된다.
- 두번째 for문에서 'Some(breed) <- dogBreeds' Some인 경우에만 성곡해서 뽑아낸다.
<- 와 = 은 언제 사용할까?
- 컬렉션이나 Option과 같은 다른 '컨테이너'를 대상으로 반복하면서 값을 가져와야 하는 경우 화살표를 사용한다.
- for 내장에 첫번째 식은 반드시 화살표를 사용한 추출 반복이어야 한다.
- 반복과 관계없이 값을 대입해야 하는 경우에는 등호를 사용한다.