[Java 8]Lambda式
Java 8はLambda式をサポートし始めた.これはJSR 335仕様の一部です.Lambda式の非公式名は「閉パッケージ」です.Java 8でLambda式をどのように実現するかを見てみましょう.
Lambda式と方法は非常に類似しており,パラメータがあり,コードがあり,戻り値がある.匿名メソッド、すなわちメソッド名のないメソッドとも呼ばれる.
Lambdaの主な特性の一つは,方法を別の方法にパラメータとして伝達できることである.この特性はプログラミングに無限の可能性をもたらすからだ.
関数インタフェース(Functional Interfaces)
何の方法もないインタフェースをタグインタフェースと呼ぶ.1つのインタフェースが1つの抽象メソッドのみを含む場合、関数インタフェースと呼ばれます.関数インタフェースはLambda式を具体的な実装として使用することができる.
ActionListenerクラスは関数インタフェースの一例である.多くの場合、ActionListenerは匿名の内部クラスを具体的な実装として使用する.後述の例では,ActionListenerを実装するために匿名内部クラスとLambda式をそれぞれ用いたことを比較する.
Lambda式の構造
方法は次のとおりです.
Lambda式に変換すると、次のようになります.
パラメータタイプは省略できますが、Javaコンパイラはコンテキストに基づいて推定します.
または
Lambda式には、パラメータリスト、矢印(->)、式または文ブロックの3つの部分があります.
次の例のLambda式にはパラメータも戻り値もありません(1つの方法で0つのパラメータを受け入れ、voidを返します.実はRunnableのrunメソッドの実装です):
パラメータが1つしかなく、Javaによってタイプを推定できる場合は、パラメータリストのカッコを省略することもできます.
Lambda式の主な特性
Lambda式と匿名内部クラスの主な違いは、匿名内部クラスではthisが匿名内部クラスそのものを表し、Lambda式ではthisがLambda式をカプセル化したクラスを表すことである.
Lambda式は0から任意の複数のパラメータを持つことができる.
パラメータがない場合は、空のカッコのペアを使用します.
パラメータタイプは、宣言を表示したり、コンテキストに基づいて推定したりすることができます.
パラメータタイプがコンテキストから推定できる場合、カッコも必須ではありません.
Lambda式の関数体は任意のコードセグメントであってもよい.
Lambda式の関数体は括弧で含める必要がありますが、文が1行しかない場合は括弧も必要ではありません.
Lambda式の例
次の例では、匿名の内部クラスとLambda式を使用してActionListenerを実装します.
記事の出典:
http://www.aptusource.org/2014/03/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/