map 메서드
map 함수는 객체 컬렉션과 해당 객체에 정의된 함수 f를 사용하고, 컬렉션의 n번째 객체가 f에 의해 변환된 객체인 새로운 컬렉션을 반환한다.
def square(n: Int): Int = n * n
List(1, 2, 3, 4, 5).map(square)
그러면 컬렉션이 반환된다.
List(1, 4, 9, 16, 25)
다음은 숫자 리스트를 가져와 각각의 제곱한 다음 제곱한 수를 모두 더하는 함수다. 표현식이 얼마나 간결한지 확인해 보자.
def squreAndSum(lst: List[Int]): Int = list.map(square).sum
간단한 타입이 아닌 리스트가 있다면 어떻게 해야 할까? 예를 들어 Option을 확인하면 다음과 같다.
def getUser(userName: String): Option[User] = ???
val names: List[String] = List("username1", "username2", "username3")
names.map(getUser)
다음과 같은 결과가 나올 것이다.
List(None, Some(user1), Some(user2))
flatten 메서드
스칼라에는 flatten이라는 메서드가 있는데 유용하게 사용된다.
names.map(getUser).flatten
이는 다음과 같이 처리된다.
List(user1, user2)
이 방법의 장점은 Some 인스턴스를 병합하고, None을 버린다는 점이다.
- Some(user1) -> user1
- None -> 버림
flatMap 메서드
컬렉션을 매핑한 다음 평면화를 하려면 flatMap이라는 또 다른 메서드를 사용한다.
flatten의 예를 다시 살펴보고 flatMap이 처리하는 방식을 살펴보자.
names.map(getUser).flatten // List(user1, user2)로 처리된다.
names.flatMap(getUser) // 마찬가지로 List(user1, user2)로 처리된다.
flatMap은 map과 flatten을 동시에 처리하는 메서드라고 생각하면 이해가 쉽다.
'프로그래밍 > 함수형 프로그래밍' 카테고리의 다른 글
C# 함수형 프로그래밍 스타일로 반복문 작성하기 (0) | 2024.08.21 |
---|---|
함수를 변수로 사용하기, 함수를 반환값으로 사용하기 (1) | 2024.07.23 |
스칼라(Scala) 리스트에 대해서 알아보자 (1) | 2024.07.23 |
스칼라(Scala) 기본 문법에 대해서 알아보자 (3) | 2024.07.22 |
리스프(LISP) 재귀 함수 구현해보자 (4) | 2024.07.16 |
댓글