#30 Kotlin Koans Collections/Compound tasks 해설

1 소개



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

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

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

일단 각자 도전하고 나서 볼 수 있다고 생각합니다

2 count()



count() : 인수로서 건네주는 조건식(predicate)을 만족하는 요소의 수를 돌려준다.

3 Collections/Compound tasks 해설



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

본문과 코드를 살펴보자.

Implement Customer.getMostExpensiveDeliveredProduct() and Shop.getNumberOfTimesProductWasOrdered() using functions from the Kotlin standard library.

Compound_tasks
// Return the most expensive product among all delivered products
// (use the Order.isDelivered flag)
fun Customer.getMostExpensiveDeliveredProduct(): Product? {
    TODO()
}

// Return how many times the given product was ordered.
// Note: a customer may order the same product for several times.
fun Shop.getNumberOfTimesProductWasOrdered(product: Product): Int {
    TODO()
}

/* TODO */

먼저 fun Customer.getMostExpensiveDeliveredProduct(): Product? 에 대해 생각해 봅시다.

한 고객(Customer)의 주문(orders) 중 배송된(isDelivered == true)상품(products) 중에서 가장 비싼(price의 값이 최대)인 것을 반환하도록 구현합니다.

따라서 다음과 같은 코드가 됩니다.

Compound_tasks
fun Customer.getMostExpensiveDeliveredProduct(): Product? {
    return orders.filter{it.isDelivered}.flatMap{it.products}.maxBy{it.price}
}

다음에 fun Shop.getNumberOfTimesProductWasOrdered(product: Product): Int 에 대해입니다.

인수로 전달되는 제품의 주문된 횟수를 반환하도록 구현합니다.

인수로서 건네받는 product는 호출측에 의존하므로, 모든 Product에 대응하는 설계로 할 필요가 있습니다.

따라서, 사전에 모든 Product 의 List 를 작성해 두고, 인수로서 건네받은 product 와 일치하는 횟수를 계산해 돌려주도록(듯이) 생각합니다.

(모든 Product의 List는 모든 종류의 Product가 아니라 모든 고객의 모든 주문의 모든 Product라는 의미입니다. 그래서 같은 종류의 Product가 여러 번 주문될 수도 있습니다.)

모든 Product의 List 구현은 다음과 같습니다.
(정확하게는, 1고객(Customer)의 모든 Product를 바꾸지만, 나중에 기술하는 코드로 전고객이 이하의 함수를 되찾습니다.)

Compound_tasks
fun Customer.getOrderedProductsList(): List<Product> {
    return orders.flatMap { it.products }
}

이 함수를 이용한 코드는 다음과 같습니다.

Compound_tasks
fun Shop.getNumberOfTimesProductWasOrdered(product: Product): Int {
    return customers.flatMap { it.getOrderedProductsList() }.count { it == product }
}

최종적으로 다음과 같은 구현이 됩니다.

Compound_tasks
// Return the most expensive product among all delivered products
// (use the Order.isDelivered flag)
fun Customer.getMostExpensiveDeliveredProduct(): Product? {
    return orders.filter{it.isDelivered}.flatMap{it.products}.maxBy{it.price}
}

// Return how many times the given product was ordered.
// Note: a customer may order the same product for several times.
fun Shop.getNumberOfTimesProductWasOrdered(product: Product): Int {
    return customers.flatMap { it.getOrderedProductsList() }.count { it == product }
}

fun Customer.getOrderedProductsList(): List<Product> {
    return orders.flatMap { it.products }
}


filter()/flatMap()/maxBy()에 대해 과거에 해설하고 있으므로 참고로 해 주시면 좋겠습니다.

#21 Kotlin Koans Collections/Filter map 해설
#23 Kotlin Koans Collections/FlatMap 해설
#24 Kotlin Koans Collections/Max min 해설

4 마지막으로



다음은 Kotlin Koans Collections/Get used to new style의 해설을합니다.

좋은 웹페이지 즐겨찾기