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 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