2017-01-24 9 views
0

からJava8 Lambdas vs Anonymous classes
"... [Anonymous Inner Classes]は、AICのスーパークラスとインタフェースから解決され、語彙的に囲む環境で発生する名前をシャドウすることができます。字句的に解決されます。

スコープに関する上記の説明が与えられていると、Java匿名インナークラスは、ラムダのように単純に変換されていましたか?コードのスコープがJavaの匿名の内部クラスをラムダ式に変換することからどのように変わるのでしょうか?

これら2枚、彼らは同じように振る舞うようになります。

button.addClickHandler(clickEvent -> doSomething()); 

button.addClickHandler(new ClickHandler() { 
      @Override 
      public void onClick(ClickEvent clickEvent) { 
       doSomething(); 
      } 
    }); 

が、内側の方法ではなく、doSomething(this)た場合には、ケースでしょうか?またはdoSomething(myVariable)

範囲の変更がどのように動作し、どのように動作するかの例は、非常に驚​​くべきものです。私は、Lambdasが匿名の内部クラスとは異なる他の方法があることを理解していますが、範囲の変更であり、わかりやすい説明が見つかりませんでした。

+1

これを参照してください。http://stackoverflow.com/questions/24202236/lambda-this-reference-in-java –

+0

「これ」に応じてコードが異なる動作(またはコンパイル)をするシナリオは考えられません。に指差す?あまりにも難しいはずがありません。 – shmosel

+0

具体的には「this」を参照してください:私の質問は、「AICとラムダのスコープの違いによって、この2つの違いは違いますか? ? " –

答えて

4

次の例を考えてみます。これは特に

parent_class_test

local_test

を印刷

import java.util.function.Function; 

public class Main { 
    private static abstract class ParentClass implements Function<String, String> { 
     protected String prefix = "parent_class_"; 
    } 

    public static void main(String... args) { 
     String prefix = "local_"; 
     printString("test", new ParentClass() { 
      @Override 
      public String apply(String s) { 
       return prefix + s; 
      } 
     }); 
     printString("test", s -> prefix + s); 
    } 

    private static void printString(String baseString, Function<String, String> stringMapper) { 
     System.out.println(stringMapper.apply(baseString)); 
    } 
} 

、AICにおけるprefixは、親クラスのフィールドを指し、ラムダ内の0はローカル変数を参照します。

0

Lambda this reference in java
「あなたは内部クラスのインスタンス内でこれを使用するときは、内部クラスのインスタンスに参照されているラムダ式は、これはのインスタンスに参照されていない、インナークラスではありません。ラムダ式を定義するクラスのインスタンスを参照しています。あなたのケースではMainのインスタンスになりますが、静的メソッドであるためインスタンスは存在しません。 ラムダが内部クラスではなく、方法あるので、匿名のための場合のように

したがって、ラムダ関数の範囲が包含するクラスではなく、ラムダ(のものであろう内部クラス)。

+0

ラムダは、必ずしも静的メソッドではありません。リンクされた質問のラムダは、静的コンテキストで定義されたばかりです。 – shmosel

関連する問題