scala 콜렉션의 map은 변형의 의미를 가진다. collection map을 의미하지 않는다. ;;;


1. map 예시이다. 


예시 1- range의 모든 값에 10을 곱하기

예시 2-List[Int]를 List[String]으로 변환하기

예시 3-List[Int]에 내용 변경하기

예시 4-List[String]에 내용 변경하기

println((1 to 10).map(_*10))

val ints = List(3, 10, 15)
println(ints.getClass)
println(ints)

val strings = ints.map(_.toString())
println(strings)

val variants = ints.map {
x => x * 2 + 1
}
println(variants)

val variants2 = strings.map {
x => x * 2
}
println(variants2)



결과


Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

class scala.collection.immutable.$colon$colon

List(3, 10, 15)

List(3, 10, 15)

List(7, 21, 31)

List(33, 1010, 1515)




2.  flatten 예시이다.



flatten은 콜렉션을 펼쳐놓는 메소드이다.


예시 1 - List의 List를 List로 변환 

예시 2 - Array의 Array를 List로 변환

예시 3 - List의 List를 List로 변환하면서 동일 값은 하나로 모은다. 

val lists = List(List(1), List(2))
println(lists.flatten)

val arrays = Array(Array(3), Array(4))
println(arrays.flatten.toList)

val colleagues = List(List("Kyle", "Jonathan", "Daisy"), List("Kyle", "Ethan"))
println(colleagues.flatten)
println(colleagues.flatten.distinct)


결과는 다음과 같다.


List(1, 2)

List(3, 4)

List(Kyle, Jonathan, Daisy, Kyle, Ethan)

List(Kyle, Jonathan, Daisy, Ethan)




참고로 None을 flatten을 할 때, none은 다 날려준다.

val list = List(Some(1), None, None, Some(2))
println(list.flatten)

결과

List(1, 2)





collection map에도 flatten 메소드를 적용할 수 있다.


val maps = Map("A" -> 1, "B" -> 2)
println(maps.keys.flatten)


결과는 다음과 같다.


Set(A, B)




참고로, values에 대해서 flatten 메소드를 호출하면 어떻게 될까?


val maps = Map("A" -> 1, "B" -> 2)
println(maps.values) println(maps.values.flatten) // 에러 발생


결과이다. 

MapLike(1, 2)


Error:(20, 25) No implicit view available from Int => scala.collection.GenTraversableOnce[B].

    println(maps.values.flatten)



에러가 발생한다. 이유는 MapLike 클래스라서 flatten을 사용할 수 없다. List로 바꿔서 가든지. 그냥 가든지 해야 한다.



아래 코드는 잘 동작한다. 

val maps = Map("A" -> 1, "B" -> 2)
println(maps.values.toList)





collection map의 values에도 사용할 수 있다.

val maps = Map("A" -> List(1), "B" -> List(2))
println(maps.values.flatten)

결과는 다음과 같다. 


List(1, 2)






3. flatmap 예시이다.


flatmap은 map에 flatten을 합성한 메소드이다.


val lists = List(List(1), List(2))
println(lists.flatMap(x => x.map(_*2)))


결과는 다음과 같다. 


List(2, 4)



flatmap은 map와 flatten을 합친 모양인데, 아래와 같이 테스트해서 동작여부를 볼 수 있다. 먼저 map으로 데이터를 변형한 후, flatten을 사용한다.

println(lists.map(x => x.map(_*2)))
println(lists.map(x => x.map(_*2)).flatten)

결과는 동일하다.


List(2, 4)



Posted by '김용환'
,