공부기록

scala2 tuple2를 사용할 때 Seq.map과 Map.map의 차이점 본문

일단써

scala2 tuple2를 사용할 때 Seq.map과 Map.map의 차이점

코타쿠 2024. 12. 16. 15:21
  • Seq.map을 하면 중복 원소가 남는다.

  • Map.map을 하면 key에 대한 중복원소가 제거된다.

  • 아래 코드를 보라

    def test3(): Unit = {
    val res = Seq(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
      .groupBy(_ % 3)
      .flatMap {
        case (_, v) => Some("key", v.max)
      }
    
    println(res)
    }
  • 이 코드에 대한 결과는?

    1. [("key", 10), ("key", 8), ("key", 9)]
    2. [("key", 9)]
  • 답은 2이다.

    • 1번은 flatMap이 Seq로써 동작할 때 결과이다.
    • 2번은 flatMap이 Map로써 동작할 때 결과이다.
  • groupBy를 수행하면 Map이 리턴되고, flatMap은 Map으로써 동작한다.

  • 1번의 결과를 바란다면 groupBy이후 toSeq를 반드시 넣어야 하며 그래야 flatMap이 Seq로써 동작하게 된다.

  • 이를 1번으로 헷갈리고 코딩을 한다면 key 중복이 발생할 때 다른 값으로 덮어쓰여져 데이터 누락이 발생할 수 있다.

  • 문제가 되는 데이터 외에 주변의 데이터까지 다 뜯어서 넣었다면 재연되었을 것이다.

  • 다음부터는 데이터 문제 재연이 안되면 주변의 데이터를 뜯어서 넣어보자.

  • 하지만 Map.map 임에도 Seq로써 동작할 수 있는 경우가 있다. 바로 하나의 값만 리턴하는 경우이다.

  • 아래 코드는 그 예시이다.

    def test4(): Unit = {
      val res = Seq(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
        .groupBy(_ % 3)
        .map {
          case (_, v) => v.max
        }
    
      println(res)
    }