Kotlinでコレクションをフィルタリングするfilter()の活用法!初心者向けにやさしく解説
生徒
「Kotlinで、リストの中から特定の条件に合うものだけを取り出したいときって、どうすればいいんですか?」
先生
「そのときに使える便利な関数がfilter()です。条件に合うデータだけを取り出して、新しいリストを作ることができますよ。」
生徒
「なんだか便利そうですね!使い方を詳しく教えてください!」
先生
「それでは、Kotlinのfilter()関数の基本から応用まで、やさしく解説していきましょう!」
1. filter()とは?Kotlinのコレクションを絞り込む関数
Kotlin(ことりん)のfilter()は、リストやセットなどのコレクションの中から、「条件に合うものだけ」を選び出すための関数です。たくさんのデータがある中で、必要なものだけを取り出したいときに使います。
たとえば、「点数の一覧から合格点以上だけを見る」「名前の一覧から特定の文字を含むものだけ探す」といった処理を、短く分かりやすく書けるのが特徴です。
イメージとしては、ザルで砂をふるいにかけて、小石だけを残すような感覚です。条件に合わない要素は取り除かれ、条件を満たした要素だけの新しいリストが作られます。
fun main() {
val numbers = listOf(1, 5, 10, 20)
val bigNumbers = numbers.filter { it >= 10 }
println(bigNumbers)
}
この例では、「10以上の数字」という条件でfilter()を使っています。元のリストは変わらず、条件に合う[10, 20]だけが新しいリストとして取り出されます。
2. filter()の基本的な使い方
まずは、filter()のいちばん基本的な使い方を見てみましょう。filter()は「1つずつ要素を確認して、条件に合うものだけを残す」動きをします。
次の例では、数字が入ったリストの中から「100以上の数」だけを取り出しています。条件は{ it >= 100 }の部分に書きます。
fun main() {
val numbers = listOf(50, 120, 80, 200, 30)
val filtered = numbers.filter { it >= 100 }
println(filtered)
}
[120, 200]
itは、「今チェックしている1つの数字」を表しています。filter()は、リストの先頭から順番に数字を見ていき、「100以上なら残す」「そうでなければ捨てる」という判断をしています。
大切なポイントは、元のリストは変わらないということです。条件に合った要素だけを集めた、新しいリストが作られるので、安全にデータを扱えます。
3. filter()を使って文字列を抽出する
filter()は数字だけでなく、文字列(String)のリストにも使えます。たとえば、名前の一覧から「条件に合う名前だけ」を取り出したいときに便利です。
次の例では、名前のリストから「ひらがな3文字の名前」だけを抽出しています。it.lengthは「その文字列が何文字か」を表し、== 3で3文字かどうかを判定しています。
fun main() {
val names = listOf("たろう", "じろう", "はな", "さとし", "はる")
val filtered = names.filter { it.length == 3 }
println(filtered)
}
[たろう, じろう, さとし]
このように、filter()を使うと「条件に合う文字列だけの新しいリスト」ができます。元のnamesはそのままなので、あとから別の条件で絞り込み直すこともできます。
文字列のフィルタリングでは、文字数だけでなく、特定の文字を含むか、ある文字で始まるかなど、いろいろな条件が作れます。まずは「長さで絞る」ような分かりやすい条件から試すと理解しやすいです。
4. 条件を複雑にする:複数の条件で絞る
filter()では、条件を1つだけでなく、複数の条件を組み合わせて要素を絞り込むこともできます。実際のプログラムでは「○○で、なおかつ△△」のような判断をしたい場面がよくあります。
次の例では、点数のリストから「100以上」で、さらに「偶数である」という2つの条件を同時に満たす数字だけを取り出しています。
fun main() {
val scores = listOf(80, 95, 100, 120, 75, 130)
val result = scores.filter { it >= 100 && it % 2 == 0 }
println(result)
}
[100, 120, 130]
&&は「かつ(AND)」という意味で、「両方の条件を満たす場合だけOK」という判断になります。ここでは「100以上」かつ「2で割り切れる」という2つのチェックを同時に行っています。
このように条件を組み合わせることで、「合格点以上で欠席がない人」「金額が一定以上で在庫がある商品」など、現実に近い条件分岐もシンプルに書けるようになります。
5. filterNot()で逆の条件を指定する
filterNot()という関数を使うと、「条件に合わないもの」を取り出せます。つまり、逆のフィルターです。
fun main() {
val numbers = listOf(1, 2, 3, 4, 5)
val oddNumbers = numbers.filterNot { it % 2 == 0 }
println(oddNumbers)
}
[1, 3, 5]
この例では、「偶数ではない」つまり「奇数」だけが残ります。
6. filterIndexed()で位置も使える
filterIndexed()を使えば、値だけでなく「何番目か(インデックス)」も条件にできます。
fun main() {
val items = listOf("A", "B", "C", "D", "E")
val evenIndexItems = items.filterIndexed { index, _ -> index % 2 == 0 }
println(evenIndexItems)
}
[A, C, E]
この例では、インデックス番号が偶数の要素だけを取り出しています。
7. filterを使った実用例:成績表から合格者だけ表示
以下は、Kotlinでfilter()を使って、学生の点数リストから「60点以上の人」だけを取り出す実用的な例です。
fun main() {
val students = listOf(
"たろう" to 55,
"はなこ" to 80,
"じろう" to 65,
"さとし" to 40
)
val passed = students.filter { it.second >= 60 }
for ((name, score) in passed) {
println("$name さんは合格($score 点)")
}
}
はなこ さんは合格(80 点)
じろう さんは合格(65 点)
Pair(ペア)のデータにもfilter()は使えます。このように、secondで点数を取り出して判定できます。
まとめ
Kotlinのfilter関数はリストやセットなどのコレクションを条件付きで絞り込むときにとても役立つ機能です。この記事全体を通して数値コレクションや文字列コレクションを使いながらフィルタリングの考え方を確認してきましたが、振り返ってみるとfilterを理解することはKotlinの基本文法だけでなく実務的なアプリケーション開発にも直結する重要なポイントだと分かります。特定の条件に合う要素だけを取り出すという考え方は成績管理や会員情報の抽出、売上データの分析などさまざまな場面で共通して登場するため、ここで学んだKotlinのfilterの書き方や考え方は今後別のプログラミング言語を学ぶときにも応用しやすい考え方として頭に残しておくとよいでしょう。
あらためて整理すると、基本のfilterは一つ一つの要素に対して条件式を評価し、その条件が真になった要素だけを新しいコレクションとして返してくれます。シンプルな数値の比較条件から始めて、文字列の長さや特定の文字を含むかどうかを調べる条件、さらに論理演算子を組み合わせた複数条件のフィルタリングまで、Kotlinのfilterは読みやすいコードで柔軟に表現できることが分かりました。またfilterNotを使えば条件に合わない要素だけを残すことができ、filterIndexedを使えばインデックスという位置情報も含めて絞り込みができるため、Kotlinのコレクション処理はより細かく制御できるようになります。
Kotlinのコレクションを扱うときには、まず元のデータをどのような条件で分類したいのか、どのような条件で除外したいのかを日本語で整理してからfilterの中に落とし込むと理解しやすくなります。たとえば学生のテストの点数リストから合格者だけを取り出したい場合は「六十点以上だけ残す」という自然な日本語の条件をそのままfilterに記述するイメージです。名前のリストからひらがな三文字だけを抽出したいときも「文字数が三の要素だけを取り出す」という条件をfilterの中で表現していると考えると、処理の流れが頭の中で具体的なイメージとして結びつきます。こうした一対一の対応を意識しておくと、Kotlinのfilterを使ったプログラムは読みやすく保守しやすいコードになりやすくなります。
さらに、filterをfor文やwhen式と組み合わせると、Kotlinのプログラム全体の見通しも良くなります。合格者だけのリストを作ってから一人ずつメッセージを表示したり、特定の条件に合うデータだけを別画面に表示したりする処理は、filterで必要なデータを先に絞り込んでおくことでロジックを段階的に整理できます。条件を満たす要素だけを早い段階で取り出し、その後の処理をシンプルに書き分けるという流れを何度も練習することで、Kotlinのコレクション操作に対する不安も少しずつ小さくなっていくはずです。
Kotlinのfilterを使ったサンプルプログラムの振り返り
ここでは記事の内容を踏まえて、もう一度filterを使ったKotlinのサンプルプログラムを整理しておきます。数値のリストから条件に合う値だけを抽出する処理、文字列のリストから特定のパターンを持つ要素だけを取り出す処理、インデックスを使って位置による抽出を行う処理などを組み合わせることで、日常的なアプリケーションに役立つフィルタリングの書き方が自然と身についていきます。ここで紹介するサンプルコードを自分の手元の環境で実行し、値や条件を少しずつ変えながら挙動を確認してみると、Kotlinのコレクション処理に対する理解がさらに深まるでしょう。
fun main() {
val scores = listOf(35, 58, 62, 73, 91, 48, 67)
val passed = scores.filter { it >= 60 }
println("合格点のリスト: $passed")
val highScores = scores.filter { it >= 80 }
println("高得点のリスト: $highScores")
val middleScores = scores.filter { it in 60..79 }
println("中間の点数リスト: $middleScores")
}
このサンプルでは一つの元データから三種類の条件で絞り込みを行い、それぞれ合格点のリスト、高得点のリスト、中間層のリストを作成しています。同じKotlinのfilterでも条件式を変えるだけでまったく異なるコレクションが手に入ることがよく分かります。実際の開発現場でも、売上データから一定金額以上の取引だけを抽出したり、会員情報から特定の年齢層だけを取り出したりと、ほとんど同じ考え方でさまざまなフィルタリング処理を記述できます。
また、filterとfilterNotを組み合わせることで、同じ元データから条件に合うグループと条件に合わないグループを同時に整理することもできます。合格者と不合格者、アクティブなユーザーと休止中のユーザー、在庫ありの商品と在庫切れの商品など、二つのグループに分けて扱いたい場面は現実のシステムでもよくあります。そのような場合でもKotlinのfilter系関数を使えば、読み手にとって分かりやすい形でコレクションを分割できるので、後からコードを読んだ人も意図をすぐにつかむことができます。
Kotlinのコレクション操作を今後の学習につなげる
Kotlinでコレクションを扱うときにfilterをしっかり理解しておくと、その先に登場するmapやsorted、groupByといった他の便利な拡張関数もスムーズに学びやすくなります。filterで条件に合うデータだけを取り出し、mapで形を変え、sortedで並べ替え、最後に必要な形式に整えて画面やファイルに出力するという一連の流れを意識すると、データ処理の全体像が一気につながって見えてきます。まずはfilterで基本的な絞り込みの感覚を身につけ、そのうえで少しずつ他の関数も組み合わせていくことで、Kotlinのコレクション処理全体を自分のものにしていきましょう。
もし最初は条件式を書くことが難しく感じられても、無理に難しい書き方をしようとせず、等号や不等号を使ったシンプルな条件から繰り返し練習するのがおすすめです。最初は数値の大小比較だけで構いませんが、慣れてきたら文字列の長さや特定の文字を含むかどうか、インデックスの偶奇など少しずつ条件を増やしていくと良いでしょう。Kotlinは記述が簡潔で読みやすい言語なので、filterの処理も一行から数行程度で分かりやすく書けます。小さなサンプルを自分で試しながらコレクションの動きを体感していくことが、着実なレベルアップにつながります。
生徒
「今日のKotlinのfilterの勉強で、一番印象に残ったところはどこでしたか。」
先生
「やはり同じリストから条件を変えるだけで合格者のリストや高得点のリスト、中間層のリストなどいくつものコレクションを作れたところでしょうか。条件を日本語で考えてからKotlinのfilterに落とし込むと、処理の流れがとても分かりやすくなることを体感できたと思います。」
生徒
「たしかに最初は条件式を見ると難しそうに感じましたが、『六十点以上だけ残す』とか『偶数だけ取り出す』といった言葉で考えると、Kotlinのコードも自然に読めるようになってきました。同じ考え方で文字列のリストをfilterするときも、文字数や含まれている文字を意識すればよいと分かって、少し安心しました。」
先生
「その感覚はとても大事ですね。今後Kotlinでアプリケーションを作るときにも、まず欲しいデータの条件を言葉で整理してからfilterやfilterNotを書いていくと、バグの少ない読みやすいコードになりやすいです。インデックスを使ったfilterIndexedも、画面の偶数行だけ色を変えるなど実際の画面処理と結びつけて考えるとイメージしやすいでしょう。」
生徒
「これからはテストの成績表や商品リストのような身近な例を自分で考えて、Kotlinのfilterでどんな絞り込みができるかを練習してみます。条件を増やしたり組み合わせたりしながら、mapやsortedともいっしょに使えるようになりたいです。」
先生
「とても良い目標ですね。焦らず一つ一つのサンプルを試しながら、Kotlinのコレクション操作に少しずつ慣れていきましょう。今日学んだfilterの考え方は他の言語にも共通する大切な基礎になりますから、自信を持って練習を続けてください。」