Kotlinでコレクションの要素を変換するmap()の基本と応用例
生徒
「Kotlinのmap()関数って、どんなときに使うんですか?」
先生
「map()関数は、コレクションの各要素に対して同じ処理をして、新しいコレクションを作るときに使いますよ。」
生徒
「それって例えばどんな処理ですか?」
先生
「たとえば、数字のリストを全部2倍にするような処理です。それでは、Kotlinのmap()関数の使い方を詳しく見ていきましょう!」
1. Kotlinのmap()関数とは?
Kotlinのmap()関数は、リストや配列といった「コレクション」の各要素に処理を加えて、新しいリストを作りたいときに使います。
たとえば、数字のリストがあるとして、それを全部2倍したいときにとても便利です。元のリストはそのまま残り、新しく変換されたリストが作られるのが特徴です。
2. 具体的な使い方の例
それでは実際に、Kotlinでmap()関数を使って、数字を2倍にする簡単な例を見てみましょう。
fun main() {
val numbers = listOf(1, 2, 3, 4, 5)
val doubled = numbers.map { it * 2 }
println(doubled)
}
[2, 4, 6, 8, 10]
listOfはリストを作るための関数で、map { it * 2 }の部分が変換処理です。itは各要素を表していて、それを2倍しています。
3. map()関数で文字列を変換する
数字だけでなく、文字列のリストも変換できます。たとえば、名前のリストを全部大文字にしてみましょう。
fun main() {
val names = listOf("taro", "hanako", "jiro")
val upperNames = names.map { it.uppercase() }
println(upperNames)
}
[TARO, HANAKO, JIRO]
uppercase()は、文字列をすべて大文字に変換するKotlinの関数です。このように、文字列でもmap()が活用できます。
4. map()でオブジェクトのプロパティを取り出す
もう少し実践的な使い方として、クラスのリストから特定のプロパティだけを抜き出すこともできます。
たとえば「人のリスト」から「名前だけのリスト」を作る場合は、以下のようになります。
data class Person(val name: String, val age: Int)
fun main() {
val people = listOf(
Person("Taro", 20),
Person("Hanako", 25),
Person("Jiro", 30)
)
val names = people.map { it.name }
println(names)
}
[Taro, Hanako, Jiro]
data classは、データを扱うための特別なクラスです。リストの中のPersonから、名前だけを取り出して新しいリストを作っています。
5. map()と他の処理を組み合わせる
Kotlinではmap()と他の関数を組み合わせることで、もっと複雑な処理も簡単に書けます。
たとえば、偶数だけを取り出して、それを2倍にする場合は次のようになります。
fun main() {
val numbers = listOf(1, 2, 3, 4, 5, 6)
val result = numbers.filter { it % 2 == 0 }.map { it * 2 }
println(result)
}
[4, 8, 12]
filter()は条件に合う要素だけを残す関数です。ここでは「偶数だけ」にしぼり、そのあとでmap()で2倍しています。
6. map()とmapIndexed()の違いとは?
さらに応用として、mapIndexed()という関数もあります。これは、各要素の「位置(インデックス)」も使いたいときに便利です。
fun main() {
val fruits = listOf("apple", "banana", "cherry")
val labeled = fruits.mapIndexed { index, fruit -> "$index: $fruit" }
println(labeled)
}
[0: apple, 1: banana, 2: cherry]
mapIndexedでは、最初の引数がインデックス番号、2つ目が要素になります。何番目かを付けて表示したいときなどに便利です。
7. map()関数を使う上での注意点
map()関数は元のリストを変更せず、新しいリストを作るのが基本です。なので、元のデータを壊さずに処理をしたいときにとても安全です。
また、for文を使うよりコードが短くなり、見やすくなります。特に処理が単純な場合、map()を使うことで可読性(読みやすさ)が大きく上がります。
まとめ
Kotlinのmap関数は、コレクションを扱ううえで非常に重要な要素であり、要素ごとに変換を加えて新しいリストを生成する操作として、日常的な開発の中で多くの場面で役立ちます。特に、データを加工したり、形を整えたり、必要な値だけを抽出したりする処理はアプリケーションの至るところで発生します。そのため、mapをどのように使うかを理解することは、Kotlinを扱う上での大きな基礎となります。数字を二倍にしたり、文字列を大文字にしたりといった基本的な変換だけでなく、オブジェクトのリストから特定のプロパティを取り出す処理や、filterと組み合わせることでより柔軟なデータ加工もできます。 さらに、mapは元のリストを変更しないという特徴を持つため、安全に変換処理が行える点も大きな強みです。副作用を避けつつ、意図通りの結果に変換できることは、特に複雑なデータを扱うときほど重要になります。また、for文よりも短く、読みやすく書けることが多いため、コード全体の理解がしやすくなる利点もあります。mapを自然に使えるようになると、関数型スタイルでのコーディングがぐっと身近になり、コードの表現力も高まっていきます。 実践的な場面では、mapは単体で使うよりも、filterやmapIndexedなどと組み合わせて処理の流れを整理していくことで本領を発揮します。データを加工しながら分類したり、各要素に番号をつけて整列させたりと、発展的な使い方も豊富です。開発経験を積むほど、mapがどれほど多くの局面で役立つかを実感できるようになるでしょう。そこで、ふり返りとしてmapを活用したサンプルコードを以下に示します。これまでの記事内容で学んだ要素を自然に確認できる構成になっていますので、自分のプロジェクトでも使える形を意識して見てみてください。
ふり返り用サンプルプログラム
data class Product(val name: String, val price: Int)
fun main() {
val items = listOf(
Product("apple", 120),
Product("banana", 90),
Product("orange", 150)
)
val names = items.map { it.name.uppercase() }
val pricesWithTax = items.map { (it.price * 1.1).toInt() }
val labelList = items.mapIndexed { index, item -> "${index}番目:${item.name}:${item.price}円" }
println(names)
println(pricesWithTax)
println(labelList)
}
このサンプルでは、mapで文字列を加工したり、金額に税計算を加えたり、mapIndexedで番号付きのラベルに変換したりと、mapの幅広い使い道を一度に確認できる例になっています。特に、日常的な処理でもよく出てくる「数値計算」「ラベル生成」「文字列変換」といった要素が自然に含まれているため、実務でも応用しやすい構造になっています。さらに、mapが元のリストを変更せず、新しい値を返してくれる仕組みのおかげで、変換処理が明確で読みやすく、コードの安全性も高まります。 mapは単純な関数のように見えて、データの流れを整理する強力な道具です。多くの処理を簡潔にまとめられるため、プロジェクトが大きくなるほど、mapの役割はますます大きくなります。今回学んだ内容を基礎として、mapやfilterといった関数を意識的に使い分けることで、より直感的で読みやすいKotlinコードを書けるようになっていきます。ぜひ、今後の実装でもmapの便利さを活かして、わかりやすいコードを意識してみてください。
生徒
「mapってただ変換するだけだと思っていましたけど、実際は色々な使い方ができるんですね。特にfilterと組み合わせると、すごく読みやすくなるのがびっくりしました。」
先生
「そうですね。mapは単純そうに見えて、Kotlinではとても重要な仕組みなんです。データを扱う場面ではほとんど登場するので、自然に使いこなせるとコードの質が大きく変わりますよ。」
生徒
「mapIndexedも便利ですね。番号をつけたいときに毎回for文を書いていたので、これからはもっとラクに書けそうです!」
先生
「その通りです。コレクション処理はKotlinの得意分野なので、mapやfilterを組み合わせながら、自分の書きやすい形を見つけていくと良いですね。」
生徒
「今日のまとめですごく理解が深まりました。これからの開発でどんどん使ってみます!」