mapIndexedNotNullでインデックス付き&null排除の変換を一発で行う方法

Kotlin
記事内に広告が含まれる場合があります

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 が出る可能性があるデータパース
    • 行番号付きのフィルタリングやログ整形
  • mapIndexedfilterNotNull を分けて書くよりも、mapIndexedNotNull で一行にまとめると読みやすく安全です。

インデックスを活かしつつ不要データも自動で弾きたい処理が出てきたら、ぜひ mapIndexedNotNull を思い出してみてください。

タイトルとURLをコピーしました