Kotlin에서 fold()와 reduce()의 차이점

David Mbochi Njonge 2023년1월30일
  1. Kotlin fold() 메서드 실행
  2. Kotlin reduce() 메서드 실행
  3. 결론
Kotlin에서 fold()와 reduce()의 차이점

fold()reduce() 메소드는 Iterable 인터페이스의 확장 기능입니다. 이러한 메서드는 요소 목록을 사용하고 단일 요소로 변환합니다.

Collection 인터페이스는 Iterable 인터페이스를 구현하므로 Collection 클래스의 하위 유형인 모든 클래스 또는 인터페이스와 함께 메서드를 사용할 수 있습니다.

이 튜토리얼에서는 fold()reduce() 메소드의 작동 방식을 이해하고 각 경우에 대한 예제를 제공하여 차이점을 학습합니다.

Kotlin fold() 메서드 실행

IntelliJ로 이동하여 File > New > Project를 선택하여 새 프로젝트를 만듭니다. 프로젝트 이름을 kotlinFoldAndReduce로 입력하거나 원하는 이름을 입력합니다. 언어 섹션에서 Kotlin을 선택하고 시스템 빌드 섹션에서 Intellij를 선택합니다. 생성 버튼을 눌러 프로젝트를 생성합니다.

프로젝트가 생성되면 fold() 메서드에 대해 com/fold 폴더 구조를 만들고 reduce() 메서드에 대해 com/reduce 폴더 구조를 만듭니다.

fold 폴더 아래에 Main.kt라는 이름의 새 파일을 만들고 다음 코드를 복사하여 파일에 붙여넣습니다.

package com.fold

class Product(private val name: String,
               private val price: Int){

    fun getName(): String{
        return this.name;
    }

    fun getPrice(): Int{
        return this.price
    }
}

val  products: List<Product> = listOf(
    Product("Hp laptop",200),
    Product("Java book",320),
    Product("Iphone 13",150)
)

fun main() {
    println(products.fold(0) { total, employee ->
       total+employee.getPrice()
    });
}

이 코드에서 만든 listOf() 도우미 메서드는 Product 요소 목록을 반환하고 반환된 목록에서 fold() 메서드를 호출할 수 있습니다.

fold() 메서드를 호출할 때 계산의 누적기로 사용할 초기 값을 제공해야 합니다. 반환된 컬렉션이 비어 있으면 fold() 메서드는 우리가 제공한 초기 값을 반환합니다.

코드를 실행하고 아래와 같이 목록에 있는 모든 제품 요소의 총 가격이 출력되는지 확인합니다.

출력:

670

fold() 메서드는 초기 값보다 크거나 작은 값을 확인하는 데 사용할 수도 있습니다. 다음 예제는 목록의 모든 product 요소를 테스트하여 최소 300보다 큰 product 가격을 반환하므로 fold() 함수의 초기 값으로 300을 설정합니다.

이 예제를 복사하여 파일에 붙여넣기 전에 기본 메서드에서 이전 예제를 주석 처리해야 합니다.

fun main() {
    println(products.fold(300) { expensiveProduct, product ->
        if (product.getPrice() > expensiveProduct)
            product.getPrice() else expensiveProduct
    });
}

코드를 실행하여 목록에 있는 모든 product 요소의 최대 가격 값이 출력되는지 확인합니다.

출력:

320

Kotlin reduce() 메서드 실행

reduce 폴더 아래에 Main.kt 파일을 생성하고 다음 코드를 복사하여 파일에 붙여넣습니다.

package com.reduce

val list: List<Int> = listOf(20,40,60)

fun main() {
    println(list.reduce { sum, value ->
        sum + value
    });
}

reduce() 메소드는 초기값이 없으므로 목록의 첫 번째 요소를 초기값으로 사용합니다. 이 예에서 값 20은 첫 번째 누산기 값이고 40을 사용한 계산은 다음 누산기 값을 반환합니다.

코드를 실행하고 다음 결과를 출력하는지 확인하십시오.

출력:

120

이전 예제에서는 목록이 비어 있는 경우 제공된 초기 값이 반환된다는 것을 배웠습니다. reduce() 메소드는 목록이 비어 있는 경우 UnsupportedOperationException, RuntimeException을 발생시킵니다.

reduce() 메서드에서 RuntimeException이 발생하지 않도록 하기 위해 계산을 수행하기 전에 목록이 비어 있는지 확인할 수 있습니다. 다음 코드는 int 유형 목록이 비어 있는 경우 0 값을 반환합니다.

이전 예제에 주석을 달고 이 예제를 복사하여 주석 뒤에 파일에 붙여넣습니다.

package com.reduce

val list: List<Int> = listOf()

fun main() {
    val data = if (list.isEmpty()) 0
    else list.reduce { sum, value ->
        sum + value
    }
    println(data);
}

코드를 실행하고 우리가 만든 목록이 비어 있으므로 콘솔에 기록된 값이 0입니다.

출력:

0

결론

이 튜토리얼에서는 fold()reduce() 확장 함수를 구별하는 방법을 배웠습니다. 또한 throw될 수 있는 예외를 피하기 위해 목록이 비어 있는 상황을 두 메서드가 처리하는 방법을 다루었습니다.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub