Kotlin

reduce, fold

kakaroo 2022. 3. 26. 02:26
반응형

 

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