2015-12-01 9 views
8

読んでいるにもかかわらず、わかりにくいコードがいくつか出てきました。 2つの引数を取るメソッドへの呼び出しがあります。その1つはRunnableです。ラムダがあるにもかかわらず、Runnableオブジェクトを渡すのではなく。例えばJava8のラムダからRunnableを作成する方法

 
public class LambdaTest { 

    private final Lock lock = new ReentrantLock(); 

    @Test 
    public void createRunnableFromLambda() { 
     Locker.runLocked(lock,() -> { 
      System.out.println("hello world"); 
     }); 
    } 

    public static class Locker { 
     public static void runLocked(Lock lock, Runnable block) { 
      lock.lock(); 
      try { 
       block.run(); 
      } finally { 
       lock.unlock(); 
      } 
     } 
    } 
} 

だから私の質問は、あなたがたRunnableはラムダから作成する方法を説明することができ、また、誰かが構文を(説明することができ下さい) - > {}。特に、角括弧は何を意味しますか?

ありがとうございました。

+3

トンオンライン

new Runnable(){ @Override public void run(){ System.out.println("Hello world one!"); } }; 

(私はそれがバイトコードと同等ではなく、機能面で同等であることを確信している)と*と同等ですこの。 '() - > {}' '()'は、関数インタフェースで宣言されたメソッドの仮パラメータを表します。 '{}'はそのメソッドの本体です。 ' - >'はボディからパラメータを分離します。 –

答えて

24

ラムダは、機能インターフェイスが必要な場所であればどこでも使用できます。 機能インタフェースは、単一の抽象メソッドを持つインタフェースです。

この場合に使用されるラムダ構文は(arguments) -> {blockOfCodeOrExpression}です。引数が1つの場合はカッコを省略でき、単一のコマンドや式の場合はカッコを省略することができます。言い換えれば

は、() -> System.out.println("hello world");はのためのガイドの

+5

機能インターフェイスは、**抽象メソッド**を持つ任意のインターフェイスです。 'interface'は' static'や 'default'メソッドを含むことができるので、その違いが重要です。より具体的には、機能インタフェースは 'java.lang.Object'のメソッドをオーバーライドしない厳密に一つの抽象メソッドを持っています。したがって、['Comparator'](https://docs.oracle.com/javase/8/docs/api/?java/util/Comparator.html)は、2つの' abstract'メソッドを持っているにもかかわらず、機能的なインターフェースです。 'java.lang.Object'の' boolean equals(Object obj) 'メソッドです。そして、それは非抽象メソッドの多くを持っています... – Holger

+0

ありがとう@Pedro Affonso - 私の質問に答えるために、()括弧は効果的に引数がコードブロックに渡されることを言っています。 – robjwilkins

+2

_almost_相当ですが、重要な違いの1つは、本文にキーワード 'this'を使用するとどうなりますか。 –

関連する問題