Kotlinのflatten・flatMapの使い方!ネスト構造を平坦化するテクニック
先生と生徒の会話形式で理解しよう
生徒
「Kotlinで入れ子になったリストを1つにまとめる方法ってありますか?」
先生
「ありますよ。そんなときはflattenやflatMapを使います。どちらもネストされた構造を平坦化できます。」
生徒
「flattenとflatMapって名前が似ていますが、どう違うんですか?」
先生
「簡単に言うと、flattenはそのまま平坦化、flatMapは加工しながら平坦化できるんです。具体例で説明しますね。」
1. flattenとは?
flattenは、ネスト(入れ子)になったコレクションを1つにまとめる関数です。例えば、List<List<Int>>をList<Int>に変換します。
fun main() {
val nestedList = listOf(
listOf(1, 2, 3),
listOf(4, 5),
listOf(6)
)
val flatList = nestedList.flatten()
println(flatList)
}
[1, 2, 3, 4, 5, 6]
このように、入れ子構造がなくなり、すべての要素が1つのリストにまとめられます。
2. flattenの実用例
例えば、クラスごとの生徒リストを1つにまとめたい場合に便利です。
fun main() {
val classA = listOf("田中", "佐藤")
val classB = listOf("鈴木", "高橋")
val classC = listOf("伊藤")
val allStudents = listOf(classA, classB, classC).flatten()
println(allStudents)
}
[田中, 佐藤, 鈴木, 高橋, 伊藤]
クラス単位のリストをまとめて、全生徒リストを作ることができます。
3. flatMapとは?
flatMapは、各要素を加工(変換)したあとに平坦化できる関数です。flattenより柔軟な使い方ができます。
fun main() {
val sentences = listOf(
"Kotlin is fun",
"I love programming"
)
val words = sentences.flatMap { it.split(" ") }
println(words)
}
[Kotlin, is, fun, I, love, programming]
ここでは文字列を単語に分割し、全ての単語を1つのリストにまとめています。
4. flatMapの実用例:商品名とバリエーション
商品ごとにサイズや色の組み合わせを作るときに便利です。
fun main() {
val products = listOf("Tシャツ", "パーカー")
val variations = products.flatMap { product ->
listOf("${product} - S", "${product} - M", "${product} - L")
}
println(variations)
}
[Tシャツ - S, Tシャツ - M, Tシャツ - L, パーカー - S, パーカー - M, パーカー - L]
このようにflatMapは、加工しながらリストを展開するのに最適です。
5. flattenとflatMapの使い分け
- flatten:そのまま平坦化したいとき
- flatMap:加工や変換をしながら平坦化したいとき
例えば、生徒名簿をまとめるだけならflatten、名簿を整形しながらまとめたいならflatMapが適しています。