본문 바로가기
Kotlin

Fold, Reduce

by 봄석 2019. 8. 29.

Fold, Reduce

 

kotlin의 fold함수와 reduce함수 무었이 다를까요  ? 

한번 알아보도록 하겠습니다! 

 

 

 

Fold

public inline fun <T, R> Iterable<T>.fold(initial: R, operation: (acc: R, T) -> R): R {
    var accumulator = initial
    for (element in this) accumulator = operation(accumulator, element)
    return accumulator
}

fold 함수는 누산기의 기능을 합니다. 

 

fold함수의 구현을 보면 

우선 fold함수는 T타입을 받아서 R타입으로 리턴합니다.

 

매개변수로는 initial 과 operation이 있습니다 .

initial 을 리턴값R을 초기화 하는 값을 받습니다 .

operation실행할 함수를 넘겨받습니다 .

 

그리고 Iterable을 반복하여 누산기에 리턴값을 더합니다.

 

 

간단한 예를 보자면

listOf(1, 2, 3).fold(0) { sum, element -> sum + element } 

정수배열에서 fold함수를 호출하면 ,  0으로 초기화하고  1,2,3을 더한 값 6이 최종적으로 나오게 됩니다 .

 

 

Reduce

public inline fun <S, T : S> Iterable<T>.reduce(operation: (acc: S, T) -> S): S {
    val iterator = this.iterator()
    if (!iterator.hasNext()) throw UnsupportedOperationException("Empty collection can't be reduced.")
    var accumulator: S = iterator.next()
    while (iterator.hasNext()) {
        accumulator = operation(accumulator, iterator.next())
    }
    return accumulator
}

reduce함수는 인자 T타입을 받아 S 타입으로 반환합니다.

매개변수로 operation 함수를 넘겨받아 while문을 돌면서 누산합니다 .

 

 

listOf(1, 2, 3).reduce { sum, element -> sum + element } 

 간단한 예로 위와 1,2,3을 더한 값 6이 최종적으로 나오게됩니다 .

 

 

 

 

 

위 두함수 fold와 reduce 굉장히 비슷합니다 .

둘의 차이는 초기값을 받는지 아닌지 입니다 .

댓글