Java 8 について言えば、最初に思い浮かぶのはラムダ (クロージャ) と仮想拡張メソッド (デフォルト メソッド) です。この機能は、主要なテクノロジー Web サイトで長い間宣伝されてきました。また、この機能は、このイベントで説明する最初の機能でもあります。 Java 8 シリーズ (JEP126 http://openjdk.java.net/jeps/126) の初めに、jdk8 の一部のライブラリがラムダ式を使用して再設計されました。これを理解することは、Java 8 の新機能を学ぶ上で非常に重要です。
1. 機能インターフェイス
関数型インターフェイス (関数型インターフェイスは関数型インターフェイスとも呼ばれますが、実際には同じものです)。簡単に言えば、関数型インターフェイスはメソッドを 1 つだけ含むインターフェイスです。たとえば、Java 標準ライブラリの java.lang.Runnable や java.util.Comparator は、代表的な関数インターフェイスです。 Java 8 では、アノテーションとして @FunctionalInterface が提供されていますが、このアノテーションは、関数インターフェースの標準を満たしている限り、仮想マシンが自動的に決定します。インターフェイスで @FunctionalInterface アノテーションを使用して宣言するのが最善です。これにより、チームの他のユーザーが誤ってインターフェイスに新しいメソッドを追加するのを防ぐことができます。
Java の Lambda は単独で使用することはできず、それを保持するには関数型インターフェイスが必要です。ラムダ式のメソッド本体は実際には関数型インターフェイスの実装です。構文については後で説明します。
2. ラムダ構文
3つの部分が含まれています
1. 括弧内のカンマで区切られた仮パラメータ。パラメータは、関数インターフェイスのメソッドのパラメータです。
2. 矢印記号: ->
3. メソッド本体は式またはコード ブロックにすることができます。メソッド本体は関数インターフェイス内のメソッドの実装です。コード ブロックの場合は、{} で囲む必要があり、戻り値が必要です。例外が発生します。関数型インターフェイスのメソッドの戻り値が void の場合、{} は必要ありません。
全体的には次のようになります。
次のようにコードをコピーします。
(パラメータ) -> 式 または (パラメータ) -> { ステートメント;
理解しやすいように完全な例を参照してください
次のようにコードをコピーします。
/**
* ラムダ式のテスト
*
* @著者ベンヘイル
*/
パブリック クラス TestLambda {
public static void runThreadUseLambda() {
//Runnable は、void を返すパラメータなしの run メソッドのみを含む関数インターフェイスです。
//したがって、ラムダ式の左側にはパラメータはなく、右側にはリターンもありません。単に文を出力するだけです。
new Thread(() ->System.out.println("ラムダによって実装されたスレッド")).start();
}
public static void runThreadUseInnerClass() {
//この方法については多くは説明しません。これは古いバージョンでは一般的なアプローチでした。
new Thread(new Runnable() {
@オーバーライド
public void run() {
System.out.println("内部クラスによって実装されたスレッド");
}
})。始める();
}
public static void main(String[] args) {
TestLambda.runThreadUseLambda();
TestLambda.runThreadUseInnerClass();
}
}
ラムダ式を使用して設計されたコードは、より簡潔で読みやすいことがわかります。
3. メソッドのリファレンス
実際、これはラムダ式を記述する簡略化された方法であり、参照されるメソッドは実際にはラムダ式のメソッド本体の実装です。構文も非常に単純です (クラス名またはインスタンス名にすることができます)。中央は「::」、右側は対応するメソッド名です。以下に示すように:
次のようにコードをコピーします: ObjectReference::methodName
一般的なメソッドの引用形式は次のとおりです。
静的メソッドの場合は、ClassName::methodName です。 Object::equals など
インスタンス メソッドの場合は、Instance::methodName です。 Object obj=new Object();obj::equals; など。
コンストラクターです。
理解を容易にするために完全な例を見てみましょう。
次のようにコードをコピーします。
java.awt.FlowLayoutをインポートします。
インポートjava.awt.event.ActionEvent;
javax.swing.JButtonをインポートします。
javax.swing.JFrameをインポートします。
/**
*
* @著者ベンヘイル
*/
パブリック クラス TestMethodReference {
public static void main(String[] args) {
JFrame フレーム = new JFrame();
Frame.setLayout(new FlowLayout());
フレーム.setVisible(true);
JButton button1 = new JButton("クリックしてください!");
JButton button2 = new JButton("私もクリックしてください!");
フレーム.getContentPane().add(button1);
フレーム.getContentPane().add(button2);
//ここでの addActionListener メソッドのパラメータは、関数インターフェイスである ActionListener です。
//ラムダ式メソッドを使用する
button1.addActionListener(e -> { System.out.println("これが Lambda 実装です"); });
//メソッド参照メソッドを使用する
button2.addActionListener(TestMethodReference::doSomething);
}
/**
※関数型インターフェースActionListenerの実装方法はこちら
* @param e
*/
public static void doSomething(ActionEvent e) {
System.out.println("メソッド参照実装は次のとおりです");
}
}
doSomething メソッドがラムダ式の実装であることがわかります。この利点は、ラムダ メソッドが非常に長く、コードの可読性に影響を与えると思われる場合は、メソッド参照が解決策であることです。
4. まとめ
上記はラムダ式の構文の全体的な内容であり、誰もがラムダ式をある程度理解していると思いますが、実際のところ、コードが単純であれば、多くの視聴者はそれほど魅力的ではありません。 Java 8でラムダを導入する必要があるのは、ラムダがあるためです式を使用すると、コレクション上のデータのマルチスレッドまたはマルチコア処理が簡素化され、コレクションの処理速度が向上します。これについては、3 つの部分に分けて説明します。書きたいことが多すぎます。この部分では、読者がラムダ式とメソッド参照の構文と概念について説明します。最後の部分は、仮想拡張メソッド (デフォルト メソッド) の処理についてです。大規模なデータ コレクションとソリューションを活用して、ラムダ式の威力を明らかにします。乞うご期待。 。 。 。