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)
결과
collection map에도 flatten 메소드를 적용할 수 있다.
val maps = Map("A" -> 1, "B" -> 2)
println(maps.keys.flatten)
결과는 다음과 같다.
참고로, 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)
결과는 다음과 같다.
3. flatmap 예시이다.
flatmap은 map에 flatten을 합성한 메소드이다.
val lists = List(List(1), List(2))
println(lists.flatMap(x => x.map(_*2)))
결과는 다음과 같다.
flatmap은 map와 flatten을 합친 모양인데, 아래와 같이 테스트해서 동작여부를 볼 수 있다. 먼저 map으로 데이터를 변형한 후, flatten을 사용한다.
println(lists.map(x => x.map(_*2)))
println(lists.map(x => x.map(_*2)).flatten)
결과는 동일하다.