1. 概要

このクイックチュートリアルでは、Kotlinコレクションをインデックスで反復処理するいくつかの異なる方法を見ていきます。

2. インデックスのみ

コレクションインデックスのみを使用してKotlinのコレクションを反復処理するには、指定されたコレクションのインデックス拡張プロパティを使用できます

val colors = listOf("Red", "Green", "Blue")
for (i in colors.indices) {
    println(colors[i])
}

インデックスプロパティは、コレクション内のすべての有効なインデックスの範囲を返します。 もちろん、これはすべてのコレクションに適用できます。配列も同様です。

val colorArray = arrayOf("Red", "Green", "Blue")
for (i in colorArray.indices) {
    println(colorArray[i])
}

Kotlinで範囲式を使用して、同じことを実現することもできます

for (i in 0 until colors.size) {
    println(colors[i]) 
}

このコンパクトバージョンを使用することもできます。

(0 until colors.size).forEach { println(colors[it]) }

まず、0(包括的)からコレクションサイズ(排他的)までの範囲を作成します。 次に、インデックスごとに同じ println()を呼び出します。 ただし、このアプローチは、最初のアプローチに比べて少し読みにくくなっています。 したがって、可能な限りインデックス拡張プロパティを使用することをお勧めします。

3. インデックスと値

インデックスと値の両方に基づいて反復する場合は、forEachIndexed()拡張関数を使用できます。

colors.forEachIndexed { i, v -> println("The value for index $i is $v") }

上に示したように、ラムダを使用してインデックスと値の組み合わせを繰り返し処理しています。 ラムダは2つのパラメーターを受け入れます。最初のパラメーターとしてのインデックスと2番目のパラメーターとしての値です。

さらに、 for式を使用する場合は、withIndex()拡張関数を使用できます。

for (indexedValue in colors.withIndex()) {
    println("The value for index ${indexedValue.index} is ${indexedValue.value}")
 }

withIndex()関数は、IndexedValueデータクラスインスタンスのコレクションを返します。 データクラスなので、破壊パターンを使用できます

for ((i, v) in colors.withIndex()) {
    println("The value for index $i is $v")
}

破壊パターンを使用すると、よりエレガントで読みやすくなるため、ここでは推奨されるアプローチです。

最後に、場合によっては、インデックスまたは値に基づいて要素をフィルタリングする必要があります。 これを行うには、 filterIndexed()拡張関数を使用できます。

colors.filterIndexed { i, v -> i % 2 == 0 }

forEachIndexed()と同様に、この関数も同じパラメーターを持つラムダ式を受け入れます。 パラメータが必要ない場合は、アンダースコアを使用して省略できます。

colors.filterIndexed { i, _ -> i % 2 == 0 }

4. 結論

この短いチュートリアルでは、インデックスまたはインデックスと値の組み合わせを使用してコレクションを反復またはフィルタリングするさまざまな方法に慣れました。 また、パターンの破壊など、いくつかのエレガントなKotlinの概念について簡単に復習しました。

いつものように、すべての例はGitHubから入手できます。