LoginSignup
0

More than 3 years have passed since last update.

【Kotlin】for文、forEach文のインデックス(に限らずラムダの引数)はimmutable

Posted at

内容はタイトルの通りです。
以下の記事を書いた時に気になったので調べました。

ソースコード

以下の通りです。
これに限らず、ラムダの引数は確認した限りimmutableです。

for (i in 1..4) {
    i = 0 // 再代入不可でコンパイルエラー
}

(1..4).forEach {
    it = 0 // 再代入不可でコンパイルエラー
}

デコンパイル結果

デコンパイルしてみると以下のようになりました。
当たり前っちゃ当たり前ですがJava側でfinal宣言されていたりはしません。

元コード
fun main() {
    for (i in 1..4) {
        println(i)
    }

    (1..4).forEach {
        println(it)
    }
}
デコンパイル結果(一部省略)
public final class KtrTestKt {
   public static final void main() {
      int i = 1;

      for(byte var1 = 4; i <= var1; ++i) {
         boolean var2 = false;
         System.out.println(i);
      }

      byte var7 = 1;
      Iterable $this$forEach$iv = (Iterable)(new IntRange(var7, 4));
      int $i$f$forEach = false;
      Iterator var10 = $this$forEach$iv.iterator();

      while(var10.hasNext()) {
         int element$iv = ((IntIterator)var10).nextInt();
         int var5 = false;
         boolean var6 = false;
         System.out.println(element$iv);
      }

   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }
}

感想

こういう部分が最初からimmutableなのは安心感が有っていいですね。
というかKotlinに触れてからJavaStream処理に触れたので、Javaのラムダの引数が素で書くとmutableだということを想像だにしていませんでした。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0