Java 8は、Java Historyで最も変更されたバージョンと呼ばれます。これには多くの重要な新機能が含まれています。最もコアは、ラムダの表現とstreamapiの追加です。 2つは一緒に使用することもできます。まず、ラムダの表情とは何かを見てみましょう。
Lambda式を使用すると、コードがシンプルになるだけでなく、読みやすくなり、最も重要なこととして、コードの量も大幅に減少します。ただし、ある程度、これらの機能はScalaなどのJVM言語で広く使用されています。
当然のことながら、Scalaコミュニティは信じられないほどです。なぜなら、Java 8のコンテンツの多くはScalaから移動したように見えるからです。ある程度、Java 8の構文はより詳細ですが、Scalaよりもあまり明確ではありませんが、それはあまり言いません。
一方では、JavaがScalaがLambda周辺ですでに実装している機能を開発および実装し続けている場合、Scalaは必要ない場合があります。一方、匿名の内部クラスを支援するなど、いくつかのコア機能のみを提供する場合、Scalaやその他の言語は繁栄し続け、Javaを追い越す可能性があります。実際、これが最良の結果です。競争のためにのみ進歩することができます。他の言語は発展し、成長し続けており、それらが時代遅れになるかどうかを心配する必要はありません。
Lambdaの表現、ウィキペディアに関する説明は、匿名の機能と閉鎖を表すために使用されるオペレーターです。この説明はまだ非常に抽象的だと思います。例を見てみましょう。
public class swingtest {public static void main(string [] args){jframe jframe = new jframe( "my jframe"); jbutton jbutton = new jbutton( "my jbutton"); jbutton.AddActionListener(new ActionListener(){@Override public void ActionPerformed(ActionEvent e){system.out.println( "ボタンpressed!");}}); jframe.add(jbutton); jframe.pack(); jframe.setVisible(true); jframe.setDefaultCloseoperation(jframe.exit_on_close); }}これは、リスニングイベントをボタンに結合するスイングプログラミングのコードです。ボタンがクリックされると、コンテンツ「ボタンが表示されます!」コンソールに出力されます。ここでは、リスナーにバインドする匿名の内側クラスのインスタンスを作成します。これは、過去に比較的一般的なコード組織形式でもあります。しかし、よく見ると、実際に焦点を当てているのは、アクションエベントタイプとステートメントSystem.out.println( "ButtonPressed!")のパラメーターeであることがわかります。コンソールへの出力。
匿名の内部クラスを作成する前のプログラムのコードがLambda式に置き換えられた場合、コードは次のとおりです。
public class swingtest {public static void main(string [] args){jframe jframe = new jframe( "my jframe"); jbutton jbutton = new jbutton( "my jbutton"); jbutton.AddActionListener(e-> system.out.println( "ボタンを押した!")); jframe.add(jbutton); jframe.pack(); jframe.setVisible(true); jframe.setdefaultcloseoperation(jframe.exit_on_close);}}コードの中央部分の変更に注意してください。元の6行のコードから、1行を実装できます。これは、ラムダの表現の単純な形式です。
lambda式の構文は
(param1、param2、param3) - > {// todo}ここでのパラメーターのタイププログラムは、コンテキストに基づいて推測できますが、すべてのタイプを推測できるわけではありません。現時点では、宣言されたパラメータータイプを表示する必要があります。パラメーターが1つしかない場合、ブラケットを省略できます。 Todo部分にコードの1行しかない場合、外側のブレースは省略できます。上記の例のように
それで、簡潔なコードに加えて、ラムダの表現は私たちに変更をもたらしますか?
Javaでは、関数をパラメーターとしてメソッドに渡すことも、戻り値が関数の方法であることを宣言することもできないことを思い出しましょう。 Java 8の前に、答えはイエスでした。
したがって、上記の例では、実際にコードロジックをリスナーにパラメーターとして渡すことができ、匿名の内部クラスをパラメーターとして使用する必要なく、イベントがトリガーされたときにこれを行うことができることをリスナーに伝えます。これは、Java 8:Functionalプログラミングによってもたらされるもう1つの新機能でもあります。
機能的なプログラミングをサポートする多くの言語があります。 JavaScriptでは、パラメーターとして関数を渡すか、関数として値を返すことが非常に一般的です。 JavaScriptは非常に一般的な機能的言語です。
Lambdaは、欠落している機能プログラミング機能をJavaに追加し、機能を一流の市民として扱うことができます。
機能的なプログラミング言語では、ラムダ式のタイプは関数です。 Javaでは、Lambda式はオブジェクトであり、それらは特別なオブジェクトタイプ -機能的インターフェイスに接続する必要があります。
次に、機能的なインターフェイスの定義を見てみましょう。
インターフェイスに1つの抽象的なメソッドのみがある場合(オブジェクトクラスのメソッドは含まれていません)、このインターフェイスは機能的なインターフェイスと見なすことができます。
@functionalinterfacepublicインターフェイスrunnable {/** *インターフェイスを実装するオブジェクト<code> runnable </code>を使用してスレッドを作成すると、スレッドを起動すると、 *スレッドで個別に実行される * </code>メソッドが呼び出されます。 * <p> * Method <code> run </code>の汎用契約は、あらゆるアクションを実行する可能性があることです。 * * @see java.lang.thread#run() */ public Abstract void run();}実行可能なインターフェイスのステートメントを見てみましょう。 Java 8の後、実行可能なインターフェイスには追加のfunctionalinterfaceアノテーションがあり、インターフェイスが機能的なインターフェイスであることを示します。ただし、functionalInterfaceアノテーションを追加しない場合、インターフェイスに1つの抽象メソッドのみがある場合、コンパイラはインターフェイスを関数インターフェイスと見なします。
@functionalinterfacepublicインターフェイスmyinterface {void test(); string toString();}ToString()はオブジェクトクラスのメソッドであるため、MyInterfaceは機能的なインターフェイスでもありますが、ここで書き換えられ、インターフェイスの抽象的なメソッドの数は増加しません。
(ここで言及するために、Java 8では、インターフェイスのメソッドには抽象的なメソッドがあるだけでなく、特定の実装されたメソッドも持つことができます。それらはデフォルトメソッドと呼ばれ、後で詳細に紹介されます)
Javaでは、Lambda式はオブジェクトです。では、このオブジェクトのタイプは何ですか? AntionListener Interfaceインスタンスが匿名の内部クラスで作成されるSwingTestプログラムを確認しましょう。
jbutton.AddActionListener(new ActionListener(){@Override public void ActionPerformed(ActionEvent e){system.out.println( "ボタンpressed!");}});ラムダの発現により改善されました
jbutton.AddActionListener(e-> system.out.println( "ボタンを押した!"));
つまり、Lambda式を使用して、ActionListenerインターフェイスのインスタンスを作成し、ActionListenerインターフェイスの定義を調べます。
パブリックインターフェイスActionListenerは、アクションが発生したときにeventListener { /***が呼び出されます。 */ public void actionperformed(ActionEvent e);}抽象的なメソッドは1つだけです。 functionalinterfaceアノテーションは追加されていませんが、関数インターフェイスの定義にも準拠しています。コンパイラは、これを機能的なインターフェイスと見なします。
したがって、Lambda式を使用すると、機能的なインターフェイスのインスタンスを作成できます。つまり、ラムダの式は機能的なインターフェイスタイプを返します。
実際、機能インターフェイスインスタンスを作成するには3つの方法があります(functionalinterfaceアノテーションを参照):
1。ラムダ式
2。メソッド引用
3。コンストラクターメソッド参照
要約します
上記は、Java 8のLambdaの表現と機能的インターフェイスに関する簡単な理解に関するこの記事に関するすべてです。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください!