코틀린의 컬렉션에는 컬렉션 내의 데이터를 모으는 함수인
reduce()
와fold()
가 있다.
이전에 컬렉션의 확장 함수를 정리할 때 fold와 reduce도 같이 정리하려고 했지만 함수를 처음 접했을 때는 두 개를 구분하고 이해하는게 조금 어려웠다..😅 다시 찾아보고 관련 예제를 실행하며 정리를 해보니 이전보다는 두 함수를 잘 구분하고 활용할 수 있게 되었다 !
val array = listOf(1, 2, 3, 4, 5)
// 초기값을 0으로 지정할 경우
val fold1 = array.fold(0) { total, num -> total + num }
println(fold1) // 15
// 초기값을 10으로 지정할 경우
val fold2 = array.fold(10) { total, num -> total + num }
println(fold2) // 25
reduce는 순서가 있는 값에 대해 각 값에 대한 연산을 재귀적으로 수행하여 반환해주는 함수이다.
reduce의 초기값은 컬렉션의 첫 번째 요소이고 반환값은 컬렉션의 자료형이다.
reduce는 초기값을 첫 번째 요소로 정해놓고 두 번째 요소부터 연산을 진행
한다.
list의 각 원소에 대해 순차적으로 operation에 해당하는 연산을 수행하며 맨 마지막으로 계산 된 값을 반환한다.
val apple = listOf("a", "p", "p", "l", "e")
val result = apple.reduce { acc, s -> acc + s }
println(result) // apple
val array = intArrayOf()
val reduce = array.reduce { total, num -> total + num }
println(reduce)
Exception in thread "main" java.lang.UnsupportedOperationException: Empty array can't be reduced
비어있는 컬렉션
을 사용할 경우에는 fold
를 사용해야 한다. val array = intArrayOf()
val fold = array.fold(1) { total, num -> total + num }
println(fold) // 1
29(?)
가 반환 됐다.첫 번째 요소인 1
은 2가 곱해지지 않게 되어 29를 반환했다.val array = intArrayOf(1, 2, 3, 4, 5)
val reduce = array.reduce { total, num -> total + num * 2 }
println(reduce) // 29
val fold = array.fold(0) { total, num -> total + num * 2}
println(fold) // 30