중첩된 컬렉션을 푸는 메소드로 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)

반응형