[Java 8]Lambda式

3023 ワード

Java 8はLambda式をサポートし始めた.これはJSR 335仕様の一部です.Lambda式の非公式名は「閉パッケージ」です.Java 8でLambda式をどのように実現するかを見てみましょう.
Lambda式と方法は非常に類似しており,パラメータがあり,コードがあり,戻り値がある.匿名メソッド、すなわちメソッド名のないメソッドとも呼ばれる.
Lambdaの主な特性の一つは,方法を別の方法にパラメータとして伝達できることである.この特性はプログラミングに無限の可能性をもたらすからだ.
関数インタフェース(Functional Interfaces)
何の方法もないインタフェースをタグインタフェースと呼ぶ.1つのインタフェースが1つの抽象メソッドのみを含む場合、関数インタフェースと呼ばれます.関数インタフェースはLambda式を具体的な実装として使用することができる.
ActionListenerクラスは関数インタフェースの一例である.多くの場合、ActionListenerは匿名の内部クラスを具体的な実装として使用する.後述の例では,ActionListenerを実装するために匿名内部クラスとLambda式をそれぞれ用いたことを比較する.
Lambda式の構造
方法は次のとおりです.
public int add(int x, int y) {
 return x + y;
}

Lambda式に変換すると、次のようになります.
(int x, int y) -> x + y;

パラメータタイプは省略できますが、Javaコンパイラはコンテキストに基づいて推定します.
(x, y) -> x + y; //      

または
(x, y) -> { return x + y; } //       

Lambda式には、パラメータリスト、矢印(->)、式または文ブロックの3つの部分があります.
次の例のLambda式にはパラメータも戻り値もありません(1つの方法で0つのパラメータを受け入れ、voidを返します.実はRunnableのrunメソッドの実装です):
() -> { System.out.println("Hello Lambda!"); }

パラメータが1つしかなく、Javaによってタイプを推定できる場合は、パラメータリストのカッコを省略することもできます.
c -> { return c.size(); }

Lambda式の主な特性
    Lambda式と匿名内部クラスの主な違いは、匿名内部クラスではthisが匿名内部クラスそのものを表し、Lambda式ではthisがLambda式をカプセル化したクラスを表すことである.
    Lambda式は0から任意の複数のパラメータを持つことができる.
    パラメータがない場合は、空のカッコのペアを使用します.
    パラメータタイプは、宣言を表示したり、コンテキストに基づいて推定したりすることができます.
    パラメータタイプがコンテキストから推定できる場合、カッコも必須ではありません.
    Lambda式の関数体は任意のコードセグメントであってもよい.
    Lambda式の関数体は括弧で含める必要がありますが、文が1行しかない場合は括弧も必要ではありません.
Lambda式の例
次の例では、匿名の内部クラスとLambda式を使用してActionListenerを実装します.
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class AnonymousListener {
  public static void main(String[] args) {
    JButton anonBtn = new JButton("Java Button");

    //actionlistener using anonymous class
    anonBtn.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ae) {
        System.out.println("Anonymous Click!");
      }
    });

    //actionlistener using lambda expression   
    anonBtn.addActionListener(e -> { System.out.println("Lambda Click!");
    });

    JFrame frame = new JFrame("Lambda Expression Sample");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(anonBtn, BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
  }
}

記事の出典:
http://www.aptusource.org/2014/03/java-8-lambda/