'2016/10/11'에 해당되는 글 2건

  1. 2016.10.11 [scala] filter+map을 flatMap으로 변경 예시
  2. 2016.10.11 [scala] groupBy / mapValues 예제

 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을 사용하면 중복 코드가 발생하지 않는다. 






Posted by '김용환'
,


scala는 groupBy api를 제공한다. 정확히 말하면, TraserableLike.groupBy을 사용할 수 있다.


println("java scala".trim.groupBy(identity))



identity는 정의된 함수를 사용하여 단어별로 groupBy를 할 수 있다.

def identity[A](x: A): A = x// @see `conforms` for the implicit version


groupBy 결과는 다음과 같다.


Map(s -> s, j -> j, a -> aaaa,   ->  , v -> v, l -> l, c -> c)



카운트를 계산하기 위해서는 mapValues를 이용해 본다. 



println("java scala".trim.groupBy(identity).mapValues(_.size).toVector)

결과는 다음과 같다.


Vector((s,1), (j,1), (a,4), ( ,1), (v,1), (l,1), (c,1))





3 개의 값을 가진 튜플에 대해서 groupBy를 호출한다. 

val list = Seq(("one", "i", "char"), ("two", "2", "num"), ("two", "ii", "char"), ("one", "1", "num"), ("four", "iv", "char"), ("five", "iv", "char"))


val v = list.groupBy(_._3)
println(v)

val values = list.groupBy(_._3).mapValues(_.map(_._2))
println(values)



첫 번째 groupBy 결과는 다음과 같다.


Map(num -> List((two,2,num), (one,1,num)), char -> List((one,i,char), (two,ii,char), (four,iv,char), (five,iv,char)))



두 번째 groupBy-mapValues 결과는 다음과 같다.


Map(num -> List(2, 1), char -> List(i, ii, iv, iv))





키 별 개수를 알고 싶다면, 다음과 같은 코드를 사용할 수 있다.


val values1 = list.groupBy(_._3).map(t => (t._1, t._2.length))
println(values1)



Map(num -> 2, char -> 4)




Posted by '김용환'
,