#29 Kotlin Koans Collections/Fold 해설

1 소개



Kotlin 공식 레퍼런스의 Kotlin Koans Collections/Fold의 해설 기사입니다.

Kotlin Koans를 통해 Kotlin을 배우는 사람들의 도움이 되길 바랍니다.

다만, 레퍼런스를 자력으로 읽는 힘을 기르고 싶은 분은,
곧이 기사를 보지 마십시오!

한 번 각자로 도전하고 나서, 눈에 띄게 된다고 생각합니다

2 fold()/intersect()



fold() : 인수로 initial과 operation을 전달하고 컬렉션의 요소를 순서대로 operation에 적용하고 반환 값으로 결과를 반환합니다.

kotlin koans의 예를 보여줍니다.
listOf(1, 2, 3, 4).fold(1, {
    partProduct, element ->
    element * partProduct
}) == 24

위의 예에서 인수의 1initial이고 element -> element * partProductoperation입니다.

partProdcut에 initialの1가 전달되고 element에 要素の先頭(1)가 전달되고 1 * 1가 계산되어 1가 반환됩니다.
계산 결과로 반환 된 1는 partProduct에 할당되고 요소는 요소의 두 번째 (2)가 할당되고 유사한 결과가 이후 반복됩니다.

결국 1*1*2*3*4가 계산되어 24가 반환됩니다.

intersect() : 호출 원의 컬렉션의 요소와 인수로서 건네주는 컬렉션의 요소의 공통 요소를 Set의 요소로서 돌려준다.
    val a = listOf(1,2,3,4,5)
    val b = setOf(1,2,6,7)
    val result = a.intersect(b)
    println(result)

위 예제의 실행 결과는 [1,2]입니다.

3 Collections/Fold 해설



Kotlin Koans Collections/Fold의 해설입니다.
수시로 본 사이트의 내용을 인용하겠습니다.

본문과 코드를 살펴보자.

Implement Shop.getSetOfProductsOrderedByEveryCustomer() using fold.
listOf(1, 2, 3, 4).fold(1, {
    partProduct, element ->
    element * partProduct
}) == 24

Fold
// Return the set of products that were ordered by every customer
fun Shop.getSetOfProductsOrderedByEveryCustomer(): Set<Product> {
    TODO()
}

fun Shop.getSetOfProductsOrderedByEveryCustomer()를 호출하여 모든 고객(Customer)이 공통으로 구입한 Product의 Set를 반환하도록 구현합니다.

각 클래스의 속성은 다음과 같습니다.

Shop 클래스: name(String형), customers(List< Customer >형)

Customer 클래스: name(String형), city(City형), orders(List< Order >형)

Order 클래스: products(List< Product >형), isDelivered(Boolean형)

먼저 모든 고객이 구입한 모든 종류의 Prodcut Set을 생성합니다.

Fold
val allProducts = customers.flatMap{it.orders.flatMap{it.products}}.toSet()

다음으로, 모든 고객이 공통으로 구입한 Product를 allProducts를 이용해 추출해 나갑니다.

추출 할 때 fold ()와 intersect ()를 사용합니다.

다음과 같은 이미지가 됩니다.



(※Customer나 Prodcut에 붙은 첨자의 수는 편의적인 것입니다.)

최종 구현은 다음과 같습니다.

Fold
// Return the set of products that were ordered by every customer
fun Shop.getSetOfProductsOrderedByEveryCustomer(): Set<Product> {
    val allProducts = customers.flatMap{it.orders.flatMap{it.products}}.toSet()
    return customers.fold(allProducts, {
        orderedByAll, customer ->
        orderedByAll.intersect(customer.orders.flatMap { it.products }.toSet())
    })
}

4 마지막으로



다음은 Kotlin Koans Collections/Compound tasks의 해설을 하겠습니다

좋은 웹페이지 즐겨찾기