중첩된 컬렉션을 푸는 메소드로 flatMap, flatten이 있습니다

flatten은 자바의 그것과 같고요, flatMap은 map + flatten 입니다. 그렇다면 이름을 mapFlat으로 지어야 하는게 아닌가 싶지만 ㅋㅋ flatMap이라는걸로 쓰도록 약속된 것 같습니다

아무튼 두 메소드를 적절히 사용하면 컬렉션을 편하게 다룰 수 있습니다

 

data class Book(val title: String, val authors: List<String>)

val books = listOf(
    Book("날개", listOf("이상")),
    Book("태평천하", listOf("채만식")),
    Book("탁류", listOf("채만식")),
    Book("대한독립선언서", listOf("조소양", "이승만", "김좌진", *others.toTypedArray())),
)

println(books.flatMap { it.authors }.toSet())

flatMap은 인자로 주어진 람다를 컬렉션의 모든 객체에 적용(map)하고, 결과를 한 리스트로 모읍니다 (flatten)

 

val nestedList = listOf(
    listOf("a", "b"),
    listOf("c", "d"),
)

println(nestedList.flatten())  // ["a", "b", "c", "d"]

map을 안써도 된다면 flatten 메소드를 사용합니다

주의할 점은 한 depth만 되고, 여러번 중첩된 컬렉션을 1차원 배열로 평평하게 만들려면 직접 구현해줘야 합니다 (ex. https://stackoverflow.com/a/63114245/4295499)

'프로그래밍 > Kotlin' 카테고리의 다른 글

[Kotlin] Scope function (범위 함수)  (0) 2022.04.03
[Kotlin] flatMap, flatten  (0) 2022.04.02
[Kotlin] groupBy  (0) 2022.04.02
[Kotlin] count, size 함수 (kotlin in action)  (0) 2022.04.02
[Kotlin] 람다 (lambda)  (0) 2022.03.27
[Kotlin] Delegation (위임)  (0) 2022.03.27