1. mapIndexedNotNullとは?
mapIndexedNotNull
は「インデックスを使った変換」+「変換結果が null の要素は自動で弾く」を同時にこなす関数です。
- 引数
(index, value)
で位置情報を参照できる - ラムダが
null
を返した要素はリストから除外
「null チェック」と「位置依存ロジック」をまとめて書けるのが魅力です。
2. 基本的な使い方
Kotlin
val raw = listOf("100", "abc", "200", "def")
val numbers = raw.mapIndexedNotNull { idx, str ->
str.toIntOrNull()?.let { it + idx } // インデックスを加算
}
println(numbers) // [100, 202]
"abc"
と"def"
はtoIntOrNull()
が null になるため自動で除外。- インデックス位置を加味した変換も同時に行えます。
3. 実用例① 行番号付き+null排除のログ生成
Kotlin
val lines = listOf("INFO:OK", "", "ERROR:NG", null, "WARN:Slow")
val cleaned = lines.mapIndexedNotNull { i, line ->
line?.takeIf { it.isNotBlank() }?.let { "[${i + 1}] $it" }
}
println(cleaned)
// [ [1] INFO:OK, [3] ERROR:NG, [5] WARN:Slow ]
空文字や null を除外しつつ、行番号を付加した形でログ用リストを作成できます。
4. 実用例② 偶数行のみスコア計算
Kotlin
val scores = listOf(80, 70, 90, 60, 85)
val evenIndexedBonus = scores.mapIndexedNotNull { idx, score ->
if (idx % 2 == 0) score + 5 else null
}
println(evenIndexedBonus) // [85, 95, 90]
偶数インデックス行だけを対象にボーナス加算し、その他は null → 自動除外。
5. まとめ
- 特徴: インデックスを使った変換と null 除去を一手に処理。
- 使いどころ:
- 位置依存のロジックで一部要素をスキップしたい
- 変換時に null が出る可能性があるデータパース
- 行番号付きのフィルタリングやログ整形
mapIndexed
+filterNotNull
を分けて書くよりも、mapIndexedNotNull
で一行にまとめると読みやすく安全です。
インデックスを活かしつつ不要データも自動で弾きたい処理が出てきたら、ぜひ mapIndexedNotNull
を思い出してみてください。