콘텐츠로 이동

2023 03 13

2023-03-13

Scala 함수 컴비네이터

  • foldLeft(), foldRight()

    • 컬렉션에 있는 여러 요소를 한 쪽 방향으로 접어서 새로운 단 하나의 요소로 변경
    • 두 개의 요소를 가져다가 하나로 만드는 연속적인 과정
      foldLeft[B](z: B)(f: (B, A) => B): B
      foldRight[B](z: B)(op: (A, B) => B): B
      
    • foldLeft() 예시
      • 각각의 요소를 i와 j로 받아, 둘을 더해 하나의 값으로 만든다
      • 초기값 z는 0을 줬고, 결과적으로 컬렉션에 속한 모든 요소를 더한 값인 10을 출력
        object FoldLeft {
          def main(args: Array[String]): Unit = {
            val o = List(1, 2, 3, 4)
            val n = o.foldLeft(0)((i, j) => i + j)
            println(n)
          }
        }
        
        // result = 10
        
  • zip(), upzip()
    • 튜플 형태의 쌍으로 연결된 리스트를 만들어 줌
    • 짝이 안맞다면 버림
      object Zip {
        def main(args: Array[String]): Unit = {
          val o = List(1, 2, 3, 4)
          val oo = List(5, 6, 7, 8, 9)
      
          val n = o zip oo
          val nn = o ::: oo
      
          println(n) // List((1, 5), (2, 6), (3, 7), (4, 8))
          println(nn) // List(1, 2, 3, 4, 5, 6, 7, 8, 9)
        }
      }
      
  • find()
    • 원하는 조건에 맞는 첫번째 요소 반환
      object Find {
        def main(args: Array[String]): Unit = {
          val o = List(1, 2, 3, 4)
          val n = o.find(i => i >= 2)
          val nn = o.find(i => i == 9)
          println(n) // Some(2)
          println(nn) // None
        }
      }
      
  • drop(), dropWhile()
    • drop(): 해당 인덱스까지 모든 요소 버림
    • dropWhile(): 차례로 순환, 조건 맞다면 버림
      object Drop {
        def main(args: Array[String]): Unit = {
          val o = List(1, 2, 3, 4, 5, 6, 0)
          val n = o.drop(4)
          val nn = o.dropWhile(i => i < 3)
      
          println(n) // List(5, 6, 0)
          println(nn) // List(3, 4, 5, 6, 0)
        }
      }
      
  • flatten()
    • 리스트 중첩된거 1차원으로 쓱 밀어버림
      object Flatten {
        def main(args: Array[String]): Unit = {
          val o = List(List(1, 2, 3, 4), List(5, 6))
          val n = o.flatten
      
          println(n) // List(1, 2, 3, 4, 5, 6)
        }
      }