Java / 基礎 / ラムダ式 / スコープ

JavaScript ではクロージャという仕組みでスコープをその定義された環境から取ってくることができるのだが、ラムダ式はどうなのだろうか?

これを実行すると普通に list が内部で使えてそれが外部に反映されることがわかる

Fuga f = new Fuga();
List<String> list = new ArrayList<>();
String s = f.mumumu("mumumumumu", (a) -> {
   list.add(a);
   return a + "gogogogo";
});
System.out.println(s);
System.out.println(list.size()); // => 1

これはやらなくても常識感覚としてわかるが、内部で作った変数を外部から参照することはできない。

しかしスコープがつながっているとしてもこのような再代入はできなくなっている。内部に持ち込むのは自動的に final 扱いになる。

Fuga f = new Fuga();
List<String> list = new ArrayList<>();
String s = f.mumumu("mumumumumu", (a) -> {
    list = null;
    return a + "gogogogo";
});

それでは内部で変数を作った場合(変数の重複)はどうなるか?

このように外部と内部で同じ名前の変数を使うとどうなるか?

        Fuga f = new Fuga();
        List<String> list = new ArrayList<>();
        String s = f.mumumu("mumumumumu", (a) -> {
            List<String> list = new ArrayList<>();
            list.add(a);
            return a + "gogogogo";
        });

どうなるもへったくれも、これは文法違反で実行できない。