#23 Kotlin Koans Collections/FlatMap 해설

1 소개



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

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

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

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

2 flatMap()



flatMap() : 호출자 컬렉션의 요소를 연결하여 List로 반환합니다.
val result = listOf("abc", "12").flatMap { it.toCharList() }
result == listOf('a', 'b', 'c', '1', '2')

위의 예에서는 abc12 라는 요소를 가진 List 가 flatMap() 에 람다 식을 건네주고, 반환값을 연결해 List 를 생성하고 있습니다.

3 Collections/FlatMap 해설



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

본문과 코드를 살펴보자.

Implement Customer.getOrderedProducts() and Shop.getAllOrderedProducts() using flatMap.
val result = listOf("abc", "12").flatMap { it.toCharList() }
result == listOf('a', 'b', 'c', '1', '2')

FlatMap
// Return all products this customer has ordered
val Customer.orderedProducts: Set<Product> get() {
    TODO()
}

// Return all products that were ordered by at least one customer
val Shop.allOrderedProducts: Set<Product> get() {
    TODO()
}

먼저, Customer.orderedProducts 를 참조했을 때의 TODO() 의 구현을 생각해 봅시다.

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

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

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

Customer.orderedProducts를 참조할 때 Customer 인스턴스가 가진 orders 속성의 각 요소(Order)에 대한 제품 집합을 반환하도록 구현합니다.

즉, Customer→orders(Order의 List)→products(Product의 List)의 순서로 속성을 참조하고 있습니다.

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

FlatMap
val Customer.orderedProducts: Set<Product> get() {
    return orders.flatMap{it.products}.toSet()
}


다음으로, Shop.allOrderedProducts 를 참조했을 때의 TODO() 의 구현을 생각해 봅시다.

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

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

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

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

Shop.allOrderedProducts를 참조했을 때, Shop형 인스턴스의 customers의 각 요소(Customer)의 orders의 각 요소(Order)의 products의 Set를 돌려주도록(듯이) 구현합니다.

즉, Shop→customers(Customer의 List)→orders(Order의 List)→products(Product의 List)의 순서로 속성을 참조하고 있습니다.

굵은 선 부분의 참조 관계는 Customer.orderedProducts와 유사하므로이를 사용합니다.

따라서 다음과 같은 구현이 됩니다.

FlatMap
 return customers.flatMap{it.orderedProducts}.toSet()

4 마지막으로



다음은 Kotlin Koans Collections/Max min의 해설을합니다.

좋은 웹페이지 즐겨찾기