for yield 첫번째 예시 다음 공부이다
http://knight76.tistory.com/entry/scala-for-%EB%AC%B8-yield
list에 for yield를 사용한 예시이다.
간단한 for 코드이다. if 문은 for에 존재할 수도 있고, for 문 블럭 안에 존재할 수 있다.
for {
i <- 1 to 4 //1,2,3,4
if i % 2 == 0
} print(i)
println
결과는 24이다.
그런데, 컬렉션(List)라면 상황이 좀 달라진다. 컬렉션으로 비슷하게 코딩하면 에러가 발생한다.
// 에러 : Error:(37, 3) '<-' expected but '}' found.
// for {
// i <- list
// i % 2 == 0
// } println(i)
다음처럼 바꿔야 잘 동작한다.
val list = List(1, 2, 3, 4)
for (i <- list) {
print(i)
}
println
결과는 다음과 같다.
1234
List에 for yield를 간단하게 사용할 수 있다.
print(for (i <- list) yield i * 2)
println
결과는 다음과 같다.
1234
여기에 if문을 추가한 코드이다. if문을 안에 넣을 수 있지만, for 문장에 포함시킬 수 있다.
for (i <- list) {
if (i % 2 == 0) print(i)
}
println
for (i <- list if i % 2 == 0) {
print(i)
}
println
결과는 동일하게 24이다.
for문은 내부적으로 sugar스럽게 사용할 수 있다. 이를 scala's for comprehension(for 내장, 오현석님이 이미 이렇게 번역하셔서;; )이라고 한다. 스칼라 컴파일러가 for 코드를 내부적으로 flatMap 또는 forEach로 변경됨을 의미하는 개념이라 할 수 있다.
// scala's comprehension
println(for(x <- List(1) ; y <- List(1,2,3)) yield (x,y))
println(List(1).flatMap(x => List(1,2,3).map(y => (x,y))))
결과는 다음과 같다.
List((1,1), (1,2), (1,3))
List((1,1), (1,2), (1,3))
'scala' 카테고리의 다른 글
zeppelin 과 spark 연동 (0) | 2016.10.28 |
---|---|
[scala] Option 에러 처리 - 펌질.. (0) | 2016.10.26 |
[scala] 정수의 산술 연산시 IllegalFormatConversionException 발생 (0) | 2016.10.19 |
[scala] 특이한 Iterator (0) | 2016.10.19 |
[scala] Stream.empty 패턴 매치 (0) | 2016.10.18 |