リストの要素を一括変換するときは map
が定番ですが、「要素の位置(インデックス)も計算に使いたい」ケースでは mapIndexed
が活躍します。今回はその基本から応用までをまとめて紹介します。
1. mapIndexedとは
map
はリストの要素を一括で変換する定番メソッドですが、mapIndexed
を使うと 「要素の位置(インデックス)」 も一緒に扱えます。
(index, value)
でラムダが呼ばれる- 変換後も新しいリストとして返る
位置に応じたロジックをサクッと書きたいときに便利です。
2. 基本的な使い方
Kotlin
val numbers = listOf(5, 10, 15)
val result = numbers.mapIndexed { idx, value ->
// idx: 0,1,2 / value: 5,10,15
"[$idx]:${value * 2}"
}
println(result) // [ [0]:10, [1]:20, [2]:30 ]
- 第一引数がインデックス、第二が要素
map
と同様に戻り値で新リストを取得
3. 実用例① 行番号付きタグ生成
Kotlin
val items = listOf("apple", "banana", "cherry")
val tagged = items.mapIndexed { i, v ->
"Item${i + 1}: $v"
}
println(tagged)
// [Item1: apple, Item2: banana, Item3: cherry]
画面表示やログで「何行目か」を一目でわかるようにしたいときに。
4. 実用例② 交互配色パターン
Kotlin
val rows = (0 until 6).toList()
val bgColors = rows.mapIndexed { i, _ ->
if (i % 2 == 0) "#ffffff" else "#f0f0f0"
}
println(bgColors)
// [#ffffff, #f0f0f0, #ffffff, #f0f0f0, #ffffff, #f0f0f0]
テーブルやリストの偶数行/奇数行に別スタイルを当てるときに直感的。
5. 実用例③ 重み付けスコア計算
Kotlin
val scores = listOf(80, 70, 60)
val weighted = scores.mapIndexed { i, s ->
s + (i * 5) // 1行目+0, 2行目+5, 3行目+10
}
println(weighted)
// [80, 75, 70]
インデックスを“重み”に見立ててスコアを調整するときなど。
6. まとめ
mapIndexed
は 「値+位置」 を同時に扱う変換に最適- 行番号ラベル、交互スタイル、重み付け…ちょっとした工夫に便利
- 要素位置が不要なら
map
、必要なときはmapIndexed
を選択
位置情報を活かすだけで、コードの見通しや動作イメージがグッと分かりやすくなります。