flatMap은 filter+map의 역할을 할 수 있다.
filter를 먼저하고, map을 하는 일반적인 코딩이다.
val list = List(1,2,3,4,5,6,7,8,9,10)
val result = list.filter(
x => 0 == (x % 2)
).map(
x => x + 1
)
println(result)
결과는 다음과 같다.
List(3, 5, 7, 9, 11)
flatMap과 if문으로 변환하면 다음과 같다.
val flatMapResult = list.flatMap(x =>
if (0 == (x % 2)) {
Some(x+1)
} else {
None
}
)
println(flatMapResult)
결과는 위와 동일하고, 훨씬 깔끔한 느낌이다.
List(3, 5, 7, 9, 11)
filter->map을 쓰는 조합에서 flatMap으로 바꿔야 했던 사례가 있었다.
Spark으로 대용량 처리하던 중,
filter에서 사용하고, map에서도 사용해야 하는 중복 코드가 발생할 수 있는데, 이를 깔끔하게 중복처리하지 않으려면, flatMap을 사용하면 중복 코드가 발생하지 않는다.
'scala' 카테고리의 다른 글
[spark] java.lang.NoSuchMethodError: org.json4s.jackson.JsonMethods$.parse$default$3()Z 에러 (0) | 2016.10.13 |
---|---|
[scala] json 이슈 (0) | 2016.10.12 |
[scala] groupBy / mapValues 예제 (0) | 2016.10.11 |
[scala] retry (0) | 2016.10.06 |
[scala] 스칼라의 HashSet (분할상환 상수 시간) (0) | 2016.10.05 |