ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kotlin fold, reduce 메서드
    Kotlin/Kotlin 2024. 3. 10. 00:01
    728x90

    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 메서드의 경우 Iterable의 확장함수입니다.

    초기값은 컬렉션의 첫 번째 요소이며 컬렉션을 순회하면서 operation을 지속적으로 수행합니다.

     

    해당 컬렉션이 비어있으면 예외가 발생한다는 특징이 있습니다.

    따라서 컬렉션이 비어있을 수 있다면 reduceOrNull을 활용하면 null을 반환하게 됩니다.

     

    Reduce 메서드 실습

        @Test
        fun `reduce를 학습해보자`(){
            val numbers = (1..10).toList()
    
            val sumUsingReduce = numbers.reduce {total, num ->
                total + num
            }
            println(sumUsingReduce) // 55
    
    
            val emptyList = emptyList<Long>()
    
            val emptyResult = emptyList.reduceOrNull{ total, num ->
                total + num
            }
    
            println(emptyResult) //null
    
            // java.lang.UnsupportedOperationException: Empty collection can't be reduced.
            emptyList.reduce{ total, num ->
                total + num
            }
        }

     

    1부터 10까지의 정수가 담긴 List의 누적합을 더할 때 List의 첫 번째 요소를 초기값으로 활용합니다.

    또한 reduceOrNull은 리스트가 비어있는경우 null을 반환하고 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 메서드도 Iterable의 확장함수입니다.

    초기값부터 시작하여 처음부터 끝까지 연산을 적용하여 값을 누적합니다.

    컬렉션이 비어 있으면 지정된 초기 반환값을 반환합니다.

     

    Fold 메서드 실습

        @Test
        fun `fold를 학습해보자`(){
            val numbers = (1..10).toList()
            // total의 초기값은 100으로 시작한다.
            // fold는 초기값을 지정할 수 있다!!
            val sumUsingFold = numbers.fold(100) { total, num ->
                total + num
            }
            println(sumUsingFold) // 155
    
            val emptyList = emptyList<Int>()
    
            val emptyUsingFold = emptyList.fold(10){ total, num ->
                total + num
            }
    
            println(emptyUsingFold) // 10
    
        }

    1부터 10까지의 정수가 담긴 List의 누적합을 더할 때 초기값을 100으로 주면 155라는 결과가 나오게 됩니다.

    또한 fold는 reduce와 다르게 리스트가 비어있는경우 초기값을 반환하게 됩니다.

     

    728x90

    'Kotlin > Kotlin' 카테고리의 다른 글

    kotlin enum 상태 관리 구현하기  (3) 2024.09.27
    Kotlin takeIf와 takeUnless 함수  (1) 2024.03.13
    Kotlin associateBy, groupBy 함수  (0) 2024.03.09
    kotlin interface default method  (0) 2024.03.05
    kotlin delegated properties  (0) 2024.03.01

    댓글

Designed by Tistory.