2016-10-14 3 views
1

javaでの関数型プログラミングの新機能です。で何が起こっているのか、私が思っていたhere.ラムダ用java-8でインタフェースオブジェクトを作成する方法についての説明が必要

で、このコードが見つかりました:

Ball b =() -> { System.out.println("You hit it!"); }; 

は、インタフェースが

をインスタンス化なっています?

完全な例

public class LambdaBall { 
public static void main(String[] args) { 
    Ball b =() -> { System.out.println("You hit it!"); }; 
    b.hit(); 
} 

interface Ball { 
    void hit(); 
} 
} 
+1

たぶん、あなたが[公式チュートリアル]を試してみたい(http://docs.oracle.com/javase/tutorial/java/ javaOO/lambdaexpressions.html)ではなく、任意のWebソースですか? – Holger

答えて

1

これは

Ball b = new Ball() { 
    public void hit(){ 
     System.out.println("You hit it!"); 
    } 
} 

lambasが、この代わりに

Ball b =() -> System.out.println("You hit it!"); 

を行うと、両方が同じ

あるインタフェースを初期化する古い匿名クラスの方法です
+1

灰ありがとう... これは機能的なインターフェイスなので、 System.out.println( "あなたがヒットしました!") は、hit()メソッドの実際の実装で、b.hitが呼び出されたときのものです。実行されます。 – Laxman

1

のJava 8、インタフェースのメソッドを定義する匿名の方法は、Java 8の創業以来

Ball b = new Ball() { 
    @Override 
    public void hit(){ 
     System.out.println("You hit it!"); 
    } 
} 

だった前に、関数に関数定義を渡すことができます。

Ball b =() -> System.out.println("You hit it!"); 

上記の行は、Ballインタフェースのhit()を遅延定義します。これが遅れて評価されることに注意してください。行b.hit();を削除すると、「あなたがヒットしました!」と気付くでしょう。コンソールには何も印刷されません。 しかし、これは単純な例であり、System.out.println()を書くことや、機能コード内に副作用がある環境を汚染することだけを避けるべきです。できるだけ機能をpureにしてみてください。

2

Lambdaが必要です。機能インタフェースが提供するターゲットタイプです。そのため、lambdaは機能インタフェースとペアで使用されています。
ターゲット形式のコンテキストでラムダ式が発生すると、機能的なインターフェイスを実装するクラスのインスタンスが自動的に作成されます。
注:インタフェースのタイプは、ラムダ

リファレンスの種類と互換性のあるべきである: - Java Complete Reference 9th Edition jdk8

関連する問題