内容はタイトルの通りです。
以下の記事を書いた時に気になったので調べました。
ソースコード
以下の通りです。
これに限らず、ラムダの引数は確認した限り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
に触れてからJava
のStream
処理に触れたので、Java
のラムダの引数が素で書くとmutable
だということを想像だにしていませんでした。