[Kotlin] Collections API - fold(), reduce()

2021. 4. 9. 12:38·Android/Kotlin(Java)
반응형

안녕하세요. 오늘은 fold()와 reduce()에 대해 정리하겠습니다.

1. fold()

fold() 함수의 구현

public inline fun <R> IntArray.fold(initial: R, operation: (acc: R, Int) -> R): R {
    var accumulator = initial
    for (element in this) accumulator = operation(accumulator, element)
    return accumulator
}

fold()함수는 내부 요소들을 모두 돌아가며 operation을 수행한 결과를 반환합니다.

reduce()와의 차이점은 초기값을 설정할 수 있고, emptyList여도 Exception을 던지지 않습니다.

import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test

class FoldReduceTest {

    @Test
    fun foldTest() {
        val intArray = intArrayOf(1, 2, 3)
        val foldValue = intArray.fold(0) { acc, num -> acc + num }
        assertThat(foldValue).isEqualTo(6) // test success!
    }
}

 

2. reduce()

reduce() 함수의 구현

public inline fun IntArray.reduce(operation: (acc: Int, Int) -> Int): Int {
    if (isEmpty())
        throw UnsupportedOperationException("Empty array can't be reduced.")
    var accumulator = this[0]
    for (index in 1..lastIndex) {
        accumulator = operation(accumulator, this[index])
    }
    return accumulator
}

reduce()함수도 마찬가지로 내부 요소들을 모두 돌아가며 operation을 수행한 결과를 반환합니다.

 

대신에, fold()와 다른 점은 Empty List일 경우에는 redcue()를 사용하면 UnsupportedOperationException을 던집니다.

import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test

class FoldReduceTest {

    @Test
    fun reduceTest() {
        val intArray = intArrayOf(1, 2, 3)
        val reducedValue = intArray.reduce { acc, num -> acc + num }
        assertThat(reducedValue).isEqaulTo(6) // test success!
    }
}

 

그래서 컬렉션이 비어있을 가능성이 있는 경우에는 reduce()를 사용하지 말고 fold()를 사용해야 합니다.

반응형
'Android/Kotlin(Java)' 카테고리의 다른 글
  • [Kotlin/Java] 얕은복사 vs 깊은복사, Collection의 방어적 복사
  • [Kotlin] Kotlin 예외처리 - require(), requireNotNull(), check(), checkNotNull()(feat. IllegalArgumentException, IllegalStateException)
  • [Kotlin] isAssignableFrom 와 is (Java instanceOf)
  • [Kotlin] 가변 인자(vararg) 사용법(Spread Operator)
seunghwaan
seunghwaan
공부한 내용을 정리하는 개발 기록 블로그
    반응형
  • seunghwaan
    SH's Devlog
    seunghwaan
  • 전체
    오늘
    어제
    • 분류 전체보기 (148)
      • Android (62)
        • Basic (17)
        • Kotlin(Java) (14)
        • UI & Animation (1)
        • Compose (2)
        • Coroutines (1)
        • Dependency Injection (6)
        • RxJava (8)
        • BLE (3)
        • TDD (2)
        • JetPack (1)
        • NextStep (4)
        • Error Log (3)
      • Flutter (14)
        • Basic (5)
        • Dart (1)
        • State Management (2)
        • Widgets (4)
        • Error and Tips (2)
      • iOS (8)
        • Basic (0)
        • Swift (8)
      • Web Frontend (4)
        • JavaScript(TS) (4)
        • React (0)
      • CS(Computer Science) (18)
        • Network (4)
        • Database (10)
        • Design Pattern (1)
        • Computer Architecture (3)
        • Operating System (0)
      • Cloud (6)
        • AWS (6)
      • DevOps (25)
        • GIT (4)
        • CI CD (8)
        • Linux (4)
        • Docker (9)
        • Error Log (0)
      • 코딩테스트 (10)
        • DB (6)
        • 알고리즘 (4)
      • Backend (1)
        • Spring (1)
      • Mac Tip (0)
      • Language (0)
        • English (0)
        • Japanese (0)
      • Temporary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    FLUTTER
    cs
    Swift
    MySQL
    Jenkins
    Dagger
    Linux
    컴퓨터공학
    docker
    JavaScript
    시작하세요! 도커
    Kotlin
    Network
    Computer Science
    Dependency Injection
    di
    CI
    네트워크
    cognito
    상태 관리
    Android
    RxJava
    Algorithm
    database
    IOS
    AWS
    error
    CICD
    gradle
    BLE
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
seunghwaan
[Kotlin] Collections API - fold(), reduce()
상단으로

티스토리툴바