リスト — forEach() / forEachIndexed()
| 対応: | Kotlin 1.0(2016) |
|---|
Kotlinの『forEach()』はリストの各要素に対してラムダを実行します。『forEachIndexed()』はインデックスと要素を同時に受け取れます。繰り返し処理の基本メソッドです。
構文
val fruits = listOf("りんご", "バナナ", "オレンジ")
// forEach — 各要素で処理を実行します。
fruits.forEach { println(it) }
// forEachIndexed — インデックスも使います。
fruits.forEachIndexed { index, fruit ->
println("$index: $fruit")
}
// for ループと同等です。
for ((index, fruit) in fruits.withIndex()) {
println("$index: $fruit")
}
メソッド一覧
| メソッド | 概要 |
|---|---|
| リスト.forEach { it } | 各要素に対してラムダを実行します。戻り値はありません(Unit)。 |
| リスト.forEachIndexed { i, v -> } | インデックスと要素を引数にラムダを実行します。 |
| リスト.withIndex() | インデックスと要素のペア(IndexedValue)のリストを返します。 |
| リスト.onEach { it } | forEach と同じですが、元のコレクション自身を返します(チェーン可能)。 |
| マップ.forEach { (k, v) -> } | マップのキーと値を分割して受け取ります。 |
サンプルコード
sample_list_foreach.kt
data class Student(val name: String, val score: Int)
fun main() {
val students = listOf(
Student("狡噛慎也", 85),
Student("常守朱", 72),
Student("宜野座伸元", 91),
Student("征陸智己", 68)
)
// 基本の forEach
println("=== 成績一覧 ===")
students.forEach { student ->
println("${student.name}: ${student.score}点")
}
println()
// forEachIndexed で番号付き出力
println("=== 番号付き ===")
students.forEachIndexed { index, student ->
val rank = index + 1
println("$rank 位 ${student.name}: ${student.score}点")
}
println()
// マップでの forEach(キーと値を分割)
val capitals = mapOf("日本" to "東京", "フランス" to "パリ", "アメリカ" to "ワシントンD.C.")
println("=== 首都一覧 ===")
capitals.forEach { (country, capital) ->
println("$country の首都: $capital")
}
println()
// onEach — forEach と同じですがチェーンできます。
val names = students
.onEach { println("処理中: ${it.name}") }
.map { it.name }
println("名前リスト: $names")
println()
// withIndex で for ループ
println("=== withIndex ===")
for ((i, s) in students.withIndex()) {
println("[$i] ${s.name}")
}
}
kotlinc list_foreach.kt -include-runtime -d list_foreach.jar java -jar list_foreach.jar === 成績一覧 === 狡噛慎也: 85点 常守朱: 72点 宜野座伸元: 91点 征陸智己: 68点 === 番号付き === 1 位 狡噛慎也: 85点 2 位 常守朱: 72点 3 位 宜野座伸元: 91点 4 位 征陸智己: 68点 === 首都一覧 === 日本 の首都: 東京 フランス の首都: パリ アメリカ の首都: ワシントンD.C. 処理中: 狡噛慎也 処理中: 常守朱 処理中: 宜野座伸元 処理中: 征陸智己 名前リスト: [狡噛慎也, 常守朱, 宜野座伸元, 征陸智己] === withIndex === [0] 狡噛慎也 [1] 常守朱 [2] 宜野座伸元 [3] 征陸智己
概要
『forEach()』は副作用(ログ出力・DBへの書き込みなど)を伴う処理に使います。変換結果が必要な場合は『map()』、条件に合う要素を絞り込む場合は『filter()』を使うと、意図がより明確になります。
『forEach』の中でループを抜け出したい場合は『return@forEach』でラムダからリターンできます(通常の『return』は外側の関数を返します)。ループを完全に中断するには『for』ループと『break』を使います。
リストの基本操作はリスト — 生成 / listOf() / mutableListOf()を、フィルタリングと変換はリスト — filter() / map()を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。