Kotlinのflatten・flatMapの使い方!ネスト構造を平坦化するテクニック
生徒
「Kotlinで入れ子になったリストを1つにまとめる方法ってありますか?」
先生
「ありますよ。そんなときはflattenやflatMapを使います。どちらもネストされた構造を平坦化できます。」
生徒
「flattenとflatMapって名前が似ていますが、どう違うんですか?」
先生
「簡単に言うと、flattenはそのまま平坦化、flatMapは加工しながら平坦化できるんです。具体例で説明しますね。」
1. flattenとは?
flattenは、Kotlinのコレクション操作でよく使う関数で、入れ子(ネスト)になったリストを「一段だけ」平らにして、1つのリストにまとめるときに使います。
たとえば、List<List<Int>>のように「リストの中にリストが入っている形」を、List<Int>のような「普通のリスト」に変換できます。
初心者の方は、まず「箱がいくつも並んでいて、その中身を全部ひとつの箱に集める」イメージで覚えると分かりやすいです。
よくある場面としては、データがグループごとに分かれているときに、あとでまとめて一覧にしたい場合です。
flattenは、中身を加工せずにそのまま合体してくれるので、動きがシンプルで覚えやすいのもポイントです。
初心者向けのかんたんな例
fun main() {
// 3つの小さなリストが入った「入れ子のリスト」
val nestedList = listOf(
listOf(1, 2, 3),
listOf(4, 5),
listOf(6)
)
// flattenで中身だけを集めて、1つのリストにする
val flatList = nestedList.flatten()
println(flatList)
}
[1, 2, 3, 4, 5, 6]
この結果のように、元は「1つ目のリスト」「2つ目のリスト」「3つ目のリスト」と分かれていた要素が、
すべて1本のリストにまとまります。これだけで、入れ子構造がなくなり、あとから要素を数えたり探したりする処理がしやすくなります。
なお、flattenは「リストの中にリストがある形」に対して使うのが基本なので、まずは型がネストしているかどうかを意識すると迷いにくいです。
2. flattenの実用例
flattenが役立つ分かりやすい場面として、「クラスごとに分かれた生徒リストを、学年全体の名簿として1つにまとめたい」ときがあります。
たとえば学校のデータや名簿管理では、A組・B組・C組のようにグループごとにリストを作ることが多いですよね。
でも、全員の名前をまとめて表示したい場合は、入れ子のままだと扱いにくくなります。
そんなときにflattenを使うと、クラス別のリストをそのまま結合して、1つの生徒名簿リストとして取り出せます。
クラス別の名簿をまとめる例
fun main() {
// クラスごとに生徒名が分かれている
val classA = listOf("田中", "佐藤")
val classB = listOf("鈴木", "高橋")
val classC = listOf("伊藤")
// 「リストの中にリスト」が入った形にする
val classes = listOf(classA, classB, classC)
// flattenでクラスの壁をなくして、全員のリストにまとめる
val allStudents = classes.flatten()
println(allStudents)
}
[田中, 佐藤, 鈴木, 高橋, 伊藤]
このように、クラス単位で分かれていた生徒名が、1つのリストにきれいにまとまります。
まとめたあとは、人数を数えたり、名前を探したり、一覧として表示したりといった処理がやりやすくなります。
「入れ子のリストを一括でまとめたい」と感じたら、まずはflattenを思い出すとスムーズです。
3. flatMapとは?
flatMapは、Kotlinのコレクションでよく使う関数で、「変換してからまとめる」という動きを一度に行えます。
もう少しかんたんに言うと、リストの各要素をいったん別の形に加工し、その結果がリストになっている場合に、それらを最後に1つのリストへ平坦化してくれます。
そのため、ただ入れ子をなくすだけのflattenよりも、やりたいことを自然な流れで書ける場面が多いです。
初心者の方は「いったん小さく分けて、あとで全部集める」イメージで覚えると理解しやすくなります。
文章を単語に分けて、一覧のリストにする例
fun main() {
// 文章のリスト(1行ずつ入っているイメージ)
val sentences = listOf(
"Kotlin is fun",
"I love programming"
)
// 各文章をsplitで単語のリストに変換し、それをflatMapで1つにまとめる
val words = sentences.flatMap { sentence ->
sentence.split(" ")
}
println(words)
}
[Kotlin, is, fun, I, love, programming]
この例では、まず1つ1つの文章をsplitで「単語のリスト」に変換しています。
ただ、変換した直後は「単語のリストがたくさん並ぶ形」になりやすく、そのままだと扱いにくいことがあります。
そこでflatMapを使うと、変換した単語たちが一気に1つのリストへまとまり、単語一覧として扱えるようになります。
文字列の分割やデータの展開など、日常的な処理で登場しやすいので、Kotlinのリスト操作に慣れるうえで覚えておくと便利です。
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が適しています。
Kotlinを基礎からしっかり学びたい人や、 Java経験を活かしてモダンな言語にステップアップしたい人には、 定番の入門書がこちらです。
基礎からわかるKotlinをAmazonで見る※ Amazon広告リンク
まとめ
flattenとflatMapでネスト構造を整理する考え方
この記事では、KotlinにおけるflattenとflatMapの使い方について、ネストされたコレクションをどのように平坦化するのかを中心に解説してきました。 Kotlinでプログラミングをしていると、リストの中にリストが入っているような入れ子構造に出会うことは少なくありません。 クラスごとの生徒一覧、商品とそのバリエーション、文章と単語の関係など、現実のデータ構造は自然とネストされがちです。 そうしたデータを扱いやすい形に変換するために、flattenとflatMapは非常に重要な役割を果たします。 ネスト構造をそのまま扱おうとすると、for文が何重にもなり、コードが複雑になってしまいますが、 flattenやflatMapを使えば、意図がはっきりした読みやすいコードに整理できます。
flattenの特徴と向いている場面
flattenは、その名の通り「平らにする」ことに特化した関数です。 すでにリストの中身が完成していて、単純に入れ子構造を取り除きたい場合に最適です。 Listの中にあるListをまとめて一つのListに変換するだけなので、処理内容がとても分かりやすくなります。 クラスごとの名簿を一つの生徒リストにしたり、カテゴリ別に分かれたデータを一覧にしたりする場面では、 flattenを使うことで余計な処理を書かずに目的を達成できます。 Kotlin初心者にとっても理解しやすく、「まずはflattenから覚える」という学び方がおすすめです。
flatMapで加工と平坦化を同時に行う
flatMapは、各要素を変換しながら平坦化できる点が最大の特徴です。 ただまとめるだけでなく、「加工してからまとめたい」というケースではflatMapが活躍します。 文章を単語に分割したり、商品名からサイズ違いの一覧を作ったりといった処理は、 flatMapを使うことで非常に自然な形で書くことができます。 mapとflattenを組み合わせたような動きを一度に行えるため、 Kotlinのコレクション操作に慣れてくると、flatMapは欠かせない存在になります。 処理の流れがそのままコードに表れるため、後から読み返しても理解しやすい点も大きなメリットです。
flattenとflatMapの使い分けが重要な理由
flattenとflatMapは似た名前をしていますが、役割ははっきりと分かれています。 すでにネストされたデータをそのまま展開したい場合はflatten、 各要素に何らかの変換処理を加えたい場合はflatMapを選ぶのが基本です。 この使い分けを意識することで、Kotlinのコードは一段と読みやすくなります。 無理にどちらか一方で書こうとせず、処理内容に合った関数を選ぶことが、 Kotlinらしいシンプルで保守しやすいプログラムにつながります。
まとめとしてのサンプルプログラム
fun main() {
val departments = listOf(
listOf("営業", "企画"),
listOf("開発", "テスト"),
listOf("人事")
)
val allDepartments = departments.flatten()
println(allDepartments)
val members = listOf("田中", "佐藤")
val memberTasks = members.flatMap { name ->
listOf("${name}の作業A", "${name}の作業B")
}
println(memberTasks)
}
このサンプルでは、flattenで単純なリストの平坦化を行い、 flatMapで要素を加工しながらリストを展開しています。 実際の業務データを扱う場面でも、そのまま応用できる考え方です。
生徒「flattenとflatMapの違いがやっと分かりました」
先生「その理解はとても大切ですね。使い分けができるとコードが一気にきれいになります」
生徒「まとめるだけならflatten、加工しながらならflatMapですね」
先生「その通りです。処理の目的を意識すると迷わなくなります」
生徒「これからリスト操作が楽しくなりそうです」
先生「ぜひ色々なデータで試してみてください。Kotlinのコレクション操作はとても奥が深いですよ」
【未経験OK】Kotlinで始めるプログラミング入門|ゼロから「動く喜び」を体験する60分
「プログラミングを始めたい」を形にする。最新言語Kotlinで楽しむ、ものづくりの第一歩。
本講座は、プログラミング経験が全くない方のためのエントリー講座です。「コードを書くってどういうこと?」という基本から、世界中で使われている最新言語Kotlin(コトリン)を使って、実際にプログラムを動かすまでを体験します。難しい理屈よりも、まずは「自分の手で動かす楽しさ」を最短距離で実感していただきます。
具体的な体験内容と環境
【つくるもの】
簡単な言葉を入力すると自動で返答してくれる「対話型ミニプログラム」や、計算を自動化する「便利ツール」をゼロから作成します。黒い画面に自分の書いた文字が表示される瞬間は、最高の感動体験です。
【開発環境】
プロのエンジニアが実際に使っている開発ツールIntelliJ IDEA(インテリジェイ)をインストールします。ボタン一つで日本語化し、初心者でも迷わず操作できる「魔法の設定」を一緒に行います。
この60分で得られる3つの体験
プロと同じ道具を揃えることで、明日から一人でもプログラミングを続けられる環境が整います。
「変数」や「型」といった難しい言葉も、身近な例え話で解説。モヤモヤをゼロにします。
Kotlinは英語に近くて読みやすいのが特徴。自分でコードを読んで、間違いを見つけるコツも伝授します。
※本講座は、パソコン操作が不安な方でも安心して受講いただける完全マンツーマンです。あなたのペースに合わせて、一つずつ丁寧に進めていきます。
Kotlinで始めるプログラミング入門|ゼロから「動く喜び」を体験