Kotlinのitについて

採用はこちら

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 は使えません。

例えば MapforEach です。

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についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次