Kotlinのコードを読んでいると、次のような書き方をよく見かけます。
list.map { it * 2 }
ここに出てくる it は、Kotlinのラムダ式で使用される特別な変数です。
Kotlinらしい簡潔なコードを書くための重要な仕組みですが、最初は意味が分かりにくい場合もあります。
この記事では次のポイントを順番に解説します。
itの基本的な意味- ラムダ式との関係
- 実際のコード例
itが使える条件itを使わない方が良いケース- Kotlin標準関数との関係
Kotlinの it の基本概念
Kotlinの it は、
ラムダ式の引数が1つだけの場合に、自動的に使える暗黙の引数名
です。
つまり、ラムダ式の引数を明示的に書かなくても、Kotlinが自動的に it という名前で引数を用意してくれる仕組みです。
通常のラムダ式の書き方
まずは通常のラムダ式です。
val numbers = listOf(1, 2, 3)
numbers.forEach { number ->
println(number)
}
この場合
number
がラムダ式の引数です。
it を使った省略形
引数が1つだけの場合、Kotlinではこの引数名を省略できます。
numbers.forEach {
println(it)
}
この it は、先ほどの number と同じ意味です。
つまり次の2つは完全に同じ動作になります。
numbers.forEach { number ->
println(number)
}
numbers.forEach {
println(it)
}
Kotlinのラムダ式の基本構造
ラムダ式の基本形は次のようになります。
{ 引数 -> 処理 }
例えば次のコードです。
{ x -> x * 2 }
意味は次の通りです。
x を受け取り
x * 2 を返す
引数が1つのときは it が使える
引数が1つのラムダ式では、次のように書くことができます。
{ it * 2 }
これは次のコードの省略形です。
{ x -> x * 2 }
it の実用例
実際のKotlinコードでは it が頻繁に使われます。
forEach の例
val list = listOf("A", "B", "C")
list.forEach {
println(it)
}
これは次のコードと同じ意味です。
list.forEach { item ->
println(item)
}
map の例
map はコレクションを変換する関数です。
val numbers = listOf(1, 2, 3)
val doubled = numbers.map {
it * 2
}
println(doubled)
結果
[2, 4, 6]
省略しない場合は次の書き方になります。
val doubled = numbers.map { number ->
number * 2
}
filter の例
filter は条件に合う要素だけを取り出します。
val numbers = listOf(1,2,3,4,5)
val even = numbers.filter {
it % 2 == 0
}
println(even)
結果
[2, 4]
find の例
val numbers = listOf(5,10,15)
val result = numbers.find {
it > 7
}
println(result)
結果
10
it が使える条件
it が使える条件は明確です。
ラムダ式の引数が1つだけ
この場合のみ、自動的に it が使えます。
引数が2つの場合
引数が複数ある場合は it は使えません。
例えば Map の forEach です。
mapOf(1 to "A", 2 to "B").forEach { key, value ->
println("$key -> $value")
}
この場合は
key
value
という2つの引数があります。
そのため it は使えません。
Mapで it を使う方法
Mapのエントリーを処理する場合は entries を使います。
val map = mapOf(1 to "A", 2 to "B")
map.entries.forEach {
println(it.key)
println(it.value)
}
この場合
it = Map.Entry
になります。
it がネストすると読みづらくなる
ラムダ式が入れ子になると、it は読みづらくなります。
例えば次のコードです。
listOf(1,2,3).map {
listOf(10,20).map {
it * 2
}
}
このコードは動作しますが、どの it を指しているのか人間には分かりにくくなります。
ネスト時の推奨書き方
ネストがある場合は名前を付けた方が読みやすくなります。
listOf(1,2,3).map { number ->
listOf(10,20).map { inner ->
inner * number
}
}
このように書くと意味が明確になります。
it を使うべきケース
一般的に次のケースでは it を使うとコードが読みやすくなります。
短い処理
list.map { it * 2 }
条件式
users.filter { it.age > 20 }
1行の処理
list.forEach { println(it) }
it を使わない方が良いケース
処理が長い場合は、引数に名前を付けた方が読みやすくなります。
悪い例
users.filter {
it.age > 20 && it.name.startsWith("A") && it.isActive
}
良い例
users.filter { user ->
user.age > 20 && user.name.startsWith("A") && user.isActive
}
Kotlinの it のまとめ
Kotlinの it には次の特徴があります。
| 項目 | 説明 |
|---|---|
| 役割 | ラムダ式の引数の省略 |
| 使える条件 | 引数が1つ |
| メリット | コードが短くなる |
| デメリット | ネストすると読みにくい |
| よく使う場所 | map / filter / forEach |
Kotlinらしいコード例
Kotlinでは次のような書き方がよく使われます。
list
.filter { it > 10 }
.map { it * 2 }
.forEach { println(it) }
このようにラムダ式を連続して書くスタイルはKotlinらしい書き方(Kotlin idiom)と呼ばれます。
以上、Kotlinのitについてでした。
最後までお読みいただき、ありがとうございました。










