Kotlinのコレクション操作まとめ!初心者が知っておきたいポイント
生徒
「Kotlinでリストや配列の使い方を効率的に覚える方法ってありますか?」
先生
「ありますよ。Kotlinには『コレクション操作』と呼ばれる便利な機能がたくさんあり、短いコードで複雑な処理を実現できます。」
生徒
「例えばどんなことができるんですか?」
先生
「要素の検索、並び替え、重複削除、グループ分け、集計などですね。それでは、初心者でもわかるように1つずつ見ていきましょう。」
1. filterとmapで条件抽出と変換
filterは「条件に合うものだけを残す」ための機能です。リストの中から必要なデータだけを選びたいときに使います。
mapは「各要素を別の形に変換する」ための機能です。たとえば数値を2倍にしたり、文字列に加工したりできます。
初心者の方は、まず「filterで選ぶ → mapで加工する」という流れで覚えると、Kotlinのリスト操作(コレクション操作)が一気に理解しやすくなります。
fun main() {
val numbers = listOf(1, 2, 3, 4, 5)
// 偶数だけ残して(filter)、その偶数を2倍にする(map)
val doubledEven = numbers.filter { it % 2 == 0 }.map { it * 2 }
println(doubledEven)
}
[4, 8]
この例では、1〜5の中から偶数(2と4)だけをfilterで取り出し、次にmapでそれぞれを2倍にしています。
「リストの中から必要なものだけを抽出して、見やすい形に変換する」という考え方は、データ処理や集計の前段でもよく使うので、ここでしっかり慣れておくと安心です。
2. any・all・noneで条件チェック
any・all・noneは、リスト(コレクション)の中身が「条件を満たしているか」を一言でチェックできる便利な関数です。if文で何回も判定を書くよりスッキリするので、Kotlinのコレクション操作の基本として覚えておくと役立ちます。
anyは「1つでも条件に合う要素があるか」、allは「全部が条件に合うか」、noneは「1つも条件に合う要素がないか」を確認します。結果はすべてtrueかfalseで返ってきます。
fun main() {
val ages = listOf(18, 20, 25)
// any:20歳未満が1人でもいる?
println(ages.any { it < 20 }) // true(18がある)
// all:全員が18歳以上?
println(ages.all { it >= 18 }) // true(全員18以上)
// none:マイナスの年齢の人はいる?
println(ages.none { it < 0 }) // true(いない)
}
たとえば「未成年が含まれているか」「全員が条件を満たしているか」「該当データが存在しないことを確認したい」といった場面でよく使います。コレクションの条件チェックを短く書けるので、初心者のうちに慣れておくと読みやすいコードになります。
3. distinct・toSetで重複削除
リストに同じ値が何度も入っていると、表示がくどくなったり、集計結果がズレたりすることがあります。そんなときに役立つのが、Kotlinの重複削除です。
distinct()は「同じ要素を1回だけ残す」関数で、元の順番をできるだけ保ったまま重複を取り除けます。一方、toSet()はリストをセット(集合)に変換して重複をなくします。セットは「同じ値を持てない」性質があるため、自然に重複が消えるイメージです。
fun main() {
val items = listOf("apple", "banana", "apple", "orange", "banana")
// distinct:重複を消して、見やすいリストにする
println(items.distinct()) // [apple, banana, orange]
// toSet:セットに変換して重複を消す(型がSetになる)
println(items.toSet()) // [apple, banana, orange]
}
たとえば「検索結果のタグ一覧」「選択肢の候補」「ユーザーが入力した値の一覧」など、同じ要素が混ざりやすい場面でよく使います。まずは手軽にリストを整理したいならdistinct、重複しない集合として扱いたいならtoSet、という感覚で覚えると迷いにくいです。
4. groupByでグループ分け
groupByは、リストの要素を「あるルール(条件)」で仕分けして、グループにまとめるための機能です。たとえば、名前を頭文字ごとに分けたり、点数を合格・不合格で分けたりといった整理が、短いコードでできます。
結果は「キー(分類の基準)」と「そのキーに入った要素の一覧」という形になります。つまり、分類表を自動で作るようなイメージです。データを見やすく整理したいときに、Kotlinのコレクション操作としてよく登場します。
fun main() {
val words = listOf("apple", "apricot", "banana", "blueberry")
// 先頭の文字(a / b)でグループ分けする
val grouped = words.groupBy { it.first() }
println(grouped)
}
{a=[apple, apricot], b=[banana, blueberry]}
この例では、it.first()で「単語の最初の文字」を取り出し、その文字ごとにまとめています。aのグループにはappleとapricot、bのグループにはbananaとblueberryが入ります。
「カテゴリ別に一覧を作る」「種類ごとに分けて表示する」といった場面で便利なので、まずは何をキーにして分けたいかを決めるのがポイントです。
5. sum・average・countで集計
合計、平均、件数を求められます。
fun main() {
val scores = listOf(80, 90, 100)
println(scores.sum()) // 270
println(scores.average()) // 90.0
println(scores.count()) // 3
}
6. zipで2つのコレクションを結合
同じインデックスの要素同士をペアにします。
fun main() {
val names = listOf("Tom", "Jane")
val scores = listOf(80, 90)
val paired = names.zip(scores)
println(paired)
}
[(Tom, 80), (Jane, 90)]
7. flatten・flatMapで入れ子構造を平坦化
リストの中のリストを1つにまとめます。
fun main() {
val nested = listOf(listOf(1, 2), listOf(3, 4))
println(nested.flatten()) // [1, 2, 3, 4]
}
8. sorted・sortedByで並び替え
sorted()は昇順に、sortedBy()は条件付きで並び替えます。
fun main() {
val items = listOf("banana", "apple", "cherry")
println(items.sorted()) // [apple, banana, cherry]
println(items.sortedBy { it.length }) // [apple, banana, cherry]
}
9. fold・reduceで累積計算
要素を順番に処理して1つの結果を作ります。
fun main() {
val numbers = listOf(1, 2, 3)
println(numbers.fold(0) { acc, n -> acc + n }) // 6
}
10. 自分で拡張関数を作る
Kotlinではオリジナルの拡張関数も作れます。例えば平均を整数で返す関数はこう書けます。
fun List<Int>.averageInt(): Int {
return if (this.isEmpty()) 0 else this.sum() / this.size
}
fun main() {
val scores = listOf(70, 80, 90)
println(scores.averageInt()) // 80
}
まとめ
Kotlinのコレクション操作を振り返ろう
この記事では、Kotlinにおけるコレクション操作について、初心者の方でも理解しやすいように順番に解説してきました。 リストや配列といったデータ構造は、プログラミングの中でも特に使用頻度が高く、扱い方を理解しているかどうかで、 コードの読みやすさや書きやすさが大きく変わってきます。
filterやmapでは、条件で絞り込みを行ったり、データの形を変換したりする方法を学びました。
これは「必要な情報だけを取り出して加工する」という、実務でも非常によく使われる考え方です。
また、any・all・noneを使うことで、リスト全体に対する条件判定を、
短く分かりやすく書けることも確認しました。
重複を取り除くdistinctやtoSet、データを分類するgroupByは、
情報を整理して見やすくするために欠かせない操作です。
データが増えてくるほど、これらの操作のありがたみを実感できるようになります。
さらに、sum・average・countによる集計処理や、
zipによる複数リストの結合など、実用的なコレクション操作も学びました。
後半では、入れ子構造を扱うflatten、並び替えを行うsortedやsortedBy、
そして要素を順番にまとめて計算するfoldについても触れました。
最後に紹介した拡張関数は、「自分がよく使う処理を自分用にまとめる」というKotlinらしい考え方を体験できる内容でした。
これらを組み合わせることで、Kotlinのコレクション操作はより強力で柔軟なものになります。
まとめとしての簡単なサンプル
fun main() {
val scores = listOf(60, 70, 80, 90)
// 70点以上だけを抽出して平均を求める
val average = scores
.filter { it >= 70 }
.average()
println(average)
}
このサンプルでは、これまで学んだ内容を組み合わせています。
条件に合う要素をfilterで抽出し、その結果に対してaverageを使うことで、
無理なく自然な流れで処理を書けることが分かります。
Kotlinのコレクション操作は、このように「つなげて書ける」点が大きな特徴です。
生徒
「最初はリスト操作が難しそうだと思っていましたが、1つずつ見ていくと、 やっていること自体は意外とシンプルなんですね。」
先生
「そうですね。Kotlinのコレクション操作は、処理の意図がそのままコードに表れやすいのが特徴です。 何をしたいのかを日本語で考えてから書くと、自然と正しい形になりますよ。」
生徒
「filterで選んで、mapで加工して、必要なら集計する、という流れがだいぶ分かってきました。 以前よりコードが読みやすくなった気がします。」
先生
「それはとても良い感覚です。今回学んだコレクション操作は、 アプリ開発でも業務システムでも必ず使います。 まずは基本をしっかり身につけて、少しずつ慣れていきましょう。」