[Kotlin] fold, reduce

Subeen·2023년 12월 12일
0

Kotlin 문법

목록 보기
17/23

코틀린의 컬렉션에는 컬렉션 내의 데이터를 모으는 함수인 reduce()fold()가 있다.
이전에 컬렉션의 확장 함수를 정리할 때 fold와 reduce도 같이 정리하려고 했지만 함수를 처음 접했을 때는 두 개를 구분하고 이해하는게 조금 어려웠다..😅 다시 찾아보고 관련 예제를 실행하며 정리를 해보니 이전보다는 두 함수를 잘 구분하고 활용할 수 있게 되었다 !

fold

  • fold는 초기값을 지정할 수 있으며 반환 값은 초기값의 자료형이다.
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의 초기값은 컬렉션의 첫 번째 요소이고 반환값은 컬렉션의 자료형이다.

  • reduce는 초기값을 첫 번째 요소로 정해놓고 두 번째 요소부터 연산을 진행한다.

  • list의 각 원소에 대해 순차적으로 operation에 해당하는 연산을 수행하며 맨 마지막으로 계산 된 값을 반환한다.

val apple = listOf("a", "p", "p", "l", "e")
val result = apple.reduce { acc, s -> acc + s }
println(result)  // apple

Empty List

  • Empty List의 경우 reduce를 사용하면 다음과 같은 오류가 발생한다.
  • 초기값을 total에 할당하고 연산을 해야 하는데 할당한 값이 없으므로 해당 오류가 발생하는 것이다.
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를 사용할 경우에는 위에서 발생한 오류 없이 초기값이 출력되는 것을 확인할 수 있다.
  • 비어있는 컬렉션을 사용할 경우에는 fold 를 사용해야 한다.
val array = intArrayOf()
val fold = array.fold(1) { total, num -> total + num }
println(fold)  // 1

첫 번째 요소

  • 다음과 같이 리스트의 각 원소에 2를 곱한 값을 누적한 total을 구하고자 할 때 fold는 의도한 대로 30을 반환했지만 reduce의 경우 의도에서 벗어난 29(?)가 반환 됐다.
  • reduce는 초기값을 첫 번째 요소로 정해놓고 두 번째 요소부터 연산을 진행한다는 특성으로 인해 첫 번째 요소인 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

참조
reduce
reduce, fold 함수

profile
개발 공부 기록 🌱

0개의 댓글