이런 형태의 코드가 있다하자
data class User(
val name :String,
val age :Int
)
val data :Map<String,List<User>> = mapOf(
"1" to listOf(User("유저1",23),User("유저2",24)),
"2" to listOf(User("유저3",27),User("유저7",21),User("유저8",21)),
"3" to listOf(User("유저4",24),User("유저6",21)),
)
이런 경우에 data.value인 List<(User)>를 하나의 리스트로 묶으려면 다음과 같이 하는것이 일반 적일 것이다.
val allUserList = arrayListOf<User>().also { arr ->
data.forEach {
arr.addAll(it.value)
}
}
그런데 Kotlin에서 이를 지원해주는 flatten이라는 문법이있다.
(단조롭게 하다라는뜻을 가지고있다.)
/**
* Returns a single list of all elements from all collections in the given collection.
* @sample samples.collections.Iterables.Operations.flattenIterable
*/
public fun <T> Iterable<Iterable<T>>.flatten(): List<T> {
val result = ArrayList<T>()
for (element in this) {
result.addAll(element)
}
return result
}
코드를 보면 2차원배열을 1차원배열로 바꿔주는 좋은 친구이다.
즉 아래와 같이
val allUserList = data.values.flatten()
사용해도 동일한 경과를 만들어낸다.