반응형
들어가며
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 |
---|