#21 Kotlinで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本
はじめに
プログラミングを学んでいると、リストの中から条件に合うものだけを取り出したい、あるいはリストの中身をまとめて別の形に変えたい、という場面によく出会います。Kotlinでは、こうした処理をコレクション操作という仕組みでシンプルに書くことができます。コレクションとは、複数のデータをひとまとめにして扱う入れ物のことで、リストや配列のようなものを指します。今回は特によく使う「絞り込み(フィルタ)」と「変換(マップ)」という考え方を中心に、初心者向けにやさしく解説します。
filterで「絞り込み」をする
まずは絞り込みです。たとえば数字のリストから偶数だけを取り出したいとします。for文とif文を組み合わせて書くこともできますが、Kotlinにはfilterという専用の関数があります。
val numbers = listOf(1, 2, 3, 4, 5, 6)
val evenNumbers = numbers.filter { it % 2 == 0 }
println(evenNumbers) // [2, 4, 6]
filterは、リストの中身を1つずつ確認し、中括弧の中に書いた条件がtrueになるものだけを新しいリストとして返してくれます。ここで登場するitは、処理中の1つひとつの要素を指す省略記法です。「今チェックしている値そのもの」と考えると分かりやすいでしょう。条件がわかりにくくなってきたら、{ number -> number % 2 == 0 }のように自分で名前をつけることもできます。
mapで「変換」をする
次は変換です。リストの中身を別の値や形に作り替えたいときに使うのがmapです。たとえば数字のリストをすべて2倍にしたい場合はこう書けます。
val numbers = listOf(1, 2, 3, 4, 5)
val doubled = numbers.map { it * 2 }
println(doubled) // [2, 4, 6, 8, 10]
mapはfilterと違い、要素の数を減らすのではなく、1つずつを新しい値に置き換えて、同じ数だけの新しいリストを作ります。「絞り込み」と「変換」は似ているようで役割が全く異なるので、この違いを意識しておくと使い分けがスムーズになります。もちろん、filterで絞り込んでからmapで変換する、という組み合わせも頻繁に使われます。
val result = numbers.filter { it % 2 == 0 }.map { it * 10 }
println(result) // [20, 40]
forEachで「1件ずつ処理」をする
絞り込みや変換をせず、単にリストの中身を1つずつ処理したいだけのときはforEachが便利です。
val names = listOf("太郎", "花子", "次郎")
names.forEach { println("こんにちは、${it}さん") }
forEachは新しいリストを作らず、それぞれの要素に対して処理(この例では画面への出力)を行うだけです。「結果としてリストが欲しいのか、単に処理を実行したいだけなのか」を意識してmapとforEachを使い分けると、コードの意図が伝わりやすくなります。
他言語との違いとつまずきやすい点
Java(Kotlinと同じくJVM上で動く言語)に慣れている方は、Streamと似ていると感じるかもしれません。ただしKotlinのfilterやmapは、呼び出した時点ですぐに新しいリストを作ります。一方Streamは、実行を後回しにする「遅延評価」という仕組みを使う点が異なります。大きなデータを何段階も処理する場合はasSequence()を使うと効率化できます。
また、初心者がよくつまずくのが「filterやmapは元のリストを変更しない」という点です。Kotlinのコレクション操作は元のリストをそのままに、結果を新しいリストとして返します。そのためnumbers.filter { ... }と書くだけで代入を忘れると、絞り込んだ結果がどこにも残りません。必ずval result = ...のように受け取りましょう。
まとめ
今回はKotlinのコレクション操作の中から、絞り込みを行うfilter、変換を行うmap、1件ずつ処理を実行するforEachという3つの基本を紹介しました。どれも「リストに対して何をしたいのか」をシンプルに表現できる仕組みです。for文とif文で書いていた処理が一行に近い形でスッキリ書けるようになると、Kotlinらしいコードの気持ちよさを実感できるはずです。ぜひ身近なリストで試してみてください。
関連記事
本ページはプロモーションを含みます。
参考書籍(PR)
Kotlinをもっと学びたい方には「やさしいKotlin入門」がおすすめです。
PR
コードを書かずに自動化したい方へ
「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿