본문 바로가기
개발/코틀린

Kotlin) reduce 와 fold

by 얼굴값하는사람 2024. 1. 18.
반응형

들어가며

kotlin 의 고차함수(Higher order function) 인 fold와 reduce 에 대해서 알아보겠습니다.

fold와 reduce 는 kotlin 의컬렉션의 각 요소에 대해 어떤 연산을 수행하고 그 결과를 반환하는 데 사용됩니다.

 

1. fold

fold 함수는 초기값(initial accumulator)과 람다 함수를 인자로 받습니다. 초기값은 연산의 시작점이 되고, 람다 함수는 현재의 누적값(accumulator)과 각 요소에 대해 수행될 연산을 정의합니다.

inline fun <T, R> Iterable<T>.fold(
    initial: R,
    operation: (acc: R, T) -> R
): R

 

예시를 통해 설명해보겠습니다

val numbers = listOf(1, 2, 3, 4, 5)

val sum = numbers.fold(0) { acc, element ->
    acc + element
}

println(sum) // 출력: 15

 

2. reduce

reduce 함수는 초기값을 사용하지 않고, 컬렉션의 첫 번째 요소부터 시작하여 람다 함수를 적용합니다. 람다 함수는 현재의 누적값과 다음 요소를 이용해 연산을 정의합니다.

inline fun <T> Iterable<T>.reduce(
    operation: (acc: T, T) -> T
): T

예시를 통해 설명해보겠습니다:

val numbers = listOf(1, 2, 3, 4, 5)

val product = numbers.reduce { acc, element ->
    acc * element
}

println(product) // 출력: 120

이 경우, reduce 함수는 초기값 없이 첫 번째 요소부터 시작하여 현재의 누적값과 다음 요소를 곱하는 람다 함수를 적용하여 곱을 계산합니다.

참고:

  • fold와 reduce는 컬렉션의 원소에 대한 연산을 병렬로 수행할 수 있는 fold와 reduce의 변형 함수도 제공됩니다(foldRight, reduceRight). 이는 연산의 결합 순서에 영향을 미칠 수 있습니다.
  • fold와 reduce 함수는 주로 불변성과 함수형 프로그래밍의 원칙을 따르며, 컬렉션의 원본을 변경하지 않습니다.

 

참고 사항

java.lang.UnsupportedOperationException: Empty collection can't be reduced.

reduce는 첫번째 element를 시작으로 accumulation 작업을 시작하는데, empty list 처럼 빈 컬렉션에서는 첫번째 element 가 없을 경우 예외가 발생하게 됩니다.

예외가 발생한 구문이 reduce 라면 fold로 바꾸고 기본값을 설정해주세요.

val numbers = listOf(1, 2, 3, 4, 5)

val sum = numbers.fold(0) { acc, element ->
    acc + element
}

println(sum) // 출력: 15

 

꼭 숙지 하셨으면 합니다. ^^

감사합니다.

반응형

'개발 > 코틀린' 카테고리의 다른 글

Kotlin) java.lang.NoSuchFieldError: FILE_HASHING_STRATEGY  (0) 2024.08.02