반응형
안녕하세요. 오늘은 fold()와 reduce()에 대해 정리하겠습니다.
1. fold()
fold() 함수의 구현
public inline fun <R> IntArray.fold(initial: R, operation: (acc: R, Int) -> R): R {
var accumulator = initial
for (element in this) accumulator = operation(accumulator, element)
return accumulator
}
fold()
함수는 내부 요소들을 모두 돌아가며 operation을 수행한 결과를 반환합니다.
reduce()
와의 차이점은 초기값을 설정할 수 있고, emptyList여도 Exception을 던지지 않습니다.
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
class FoldReduceTest {
@Test
fun foldTest() {
val intArray = intArrayOf(1, 2, 3)
val foldValue = intArray.fold(0) { acc, num -> acc + num }
assertThat(foldValue).isEqualTo(6) // test success!
}
}
2. reduce()
reduce() 함수의 구현
public inline fun IntArray.reduce(operation: (acc: Int, Int) -> Int): Int {
if (isEmpty())
throw UnsupportedOperationException("Empty array can't be reduced.")
var accumulator = this[0]
for (index in 1..lastIndex) {
accumulator = operation(accumulator, this[index])
}
return accumulator
}
reduce()
함수도 마찬가지로 내부 요소들을 모두 돌아가며 operation을 수행한 결과를 반환합니다.
대신에, fold()
와 다른 점은 Empty List일 경우에는 redcue()
를 사용하면 UnsupportedOperationException을 던집니다.
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
class FoldReduceTest {
@Test
fun reduceTest() {
val intArray = intArrayOf(1, 2, 3)
val reducedValue = intArray.reduce { acc, num -> acc + num }
assertThat(reducedValue).isEqaulTo(6) // test success!
}
}
그래서 컬렉션이 비어있을 가능성이 있는 경우에는 reduce()
를 사용하지 말고 fold()
를 사용해야 합니다.
반응형