반응형
Kotlin 컬렉션에는 컬랙션 내의 데이터를 모두 모아 더하는(accumulate) 함수인 reduce()와 fold()가 있다.
사용방법
val numbers = (1..10).toList()
// total의 초기값은 numbers[1]로 시작한다.
val sumUsingReduce = numbers.reduce {total, num ->
total + num
}
println(sumUsingReduce) // 55
// total의 초기값은 100으로 시작한다.
val sumUsingFold = numbers.fold(100) { total, num ->
total + num
}
println(sumUsingFold) // 155
Empty Collection
* 컬렉션이 비어있을 가능성이 있다면 초기값이 들어가는 fold()를 사용합니다.
val numbers = intArrayOf()
// total의 초기값은 numbers[1]로 시작한다.
val sumUsingReduce = numbers.reduce {total, num ->
total + num
}
println(sumUsingReduce)
Exception in thread "main" java.lang.UnsupportedOperationException: Empty array can't be reduced.
at MainKt.main(Main.kt:21)
First element
아래 reduce 함수에서 First element 는 total 에 5가 들어가고, num에는 2가 들어갑니다.
첫번째 인자는 5 * 2 를 수행하지 못해, 의도한 결과값과는 다르게 출력됩니다.
초기값을 첫번째 요소로 정해놓고 다음 요소부터 연산을 시작하기 때문입니다.
따라서 첫 번째 요소도 연산에 포함시키고 싶을 경우, fold를 사용하셔야합니다.
val numbers = listOf(5, 2, 10, 4)
val doubledSum = numbers.reduce { total, num -> total + num * 2 }
println("reduced: $doubledSum") // reduced: 37 -> 원래는 42가 나와야 한다!!
val doubledSumFromZero = numbers.fold(0) { total, num -> total + num * 2 }
println("folded: $doubledSumFromZero") // folded: 42
반응형
'Kotlin' 카테고리의 다른 글
sequence (0) | 2022.03.27 |
---|---|
collection (0) | 2022.03.27 |
lateinit, lazy (0) | 2022.03.26 |
Scope 함수(범위 지정 함수 - apply, with, let, also, run) (0) | 2022.03.26 |
backing field <custom getter(), setter() 설정> (0) | 2022.03.26 |