以下にJava8機能プログラミングモデルに飛び込み続けます
public class test1 {public static void main(string [] args){list <integer> list = arrays.aslist(1,2,3,4,5,6,7,8,9,10); list.foreach(new Consumer <Integer>(){@Override public void Accept(integer integer){system.out.println(integer);}}); }}このプログラムはシンプルで、最初に整数型のコレクションを初期化し、次に各要素をコンソールに出力します。その中で、Java 8に新しく追加されたデフォルトメソッドであるForeachメソッドに気付きました。
パブリックインターフェイスIterable <t> {。 。省略します。デフォルトのvoid foreach(Consumer <?super t> action){objects.requirenonnull(action); for(t t:this){action.accept(t); }}}反復可能なインターフェイスで宣言され、キーワードのデフォルトによって変更されます。このようにして、このインターフェイスのサブタイプはすべて、foreachメソッドの実装を継承できるため、リストインターフェイスは反復可能な間接的なサブインターフェイスであるため、デフォルトのメソッドも継承します。 Java8は、インターフェイスの関数を拡張するこの巧妙な方法を採用し、古いバージョンと互換性があります。
次に、foreachの実装を分析します。最初に、消費者タイプのパラメーターアクションを受け取り、空でない判断を実行し、現在のすべての要素を通過して、処理のためのアクションの受け入れ方法に引き渡します。それで、消費者は一体何ですか?ソースコードを見てください
@functionalinterfacepublic Interface Consumer <t> { /***指定された引数でこの操作を実行します。 * * @param t入力引数 */ void Accept(t t); 。 。省略。}抽象的なメソッドのみを持つインターフェイスは、典型的な機能インターフェイスである@FunctionAlinterfaceによって変更されます。
OK、今では、Foreachによって受信された消費者タイプのパラメーターが機能的なインターフェイスであることがわかっています。インターフェイス内の抽象的メソッドのみがパラメーターを受信し、値を返しません。前の記事から、機能的なインターフェイスタイプのインスタンスを作成する方法の1つは、Lambda式を使用することであるため、TOPプログラムを変換できることがわかっています。
public class test1 {public static void main(string [] args){list <integer> list = arrays.aslist(1,2,3,4,5,6,7,8,9,10); // lambda式は、値リストを返すことなくパラメーターを受信します。 }} Lambda式項目 - > System.out.println(item)は、値を返すことなくパラメーターを受信し、受け入れ方法の署名要件を満たし、コンパイルされて渡されます。
つまり、ラムダ式を使用して機能インターフェイスインスタンスを作成する場合、このラムダ式のエントリパラメーターとリターンは、この機能インターフェイスの唯一の抽象的なメソッドのメソッド署名に準拠する必要があります。
次に、プログラムが変更されます
public class test1 {public static void main(string [] args){list <integer> list = arrays.aslist(1,2,3,4,5,6,7,8,9,10); //メソッドリファレンスリスト。Foreach(System.out :: println); }}後ろに2本のコロンが見えましたが、とにかく混乱していました。 。 。これは、関数インターフェイスインスタンスを作成する2番目の方法です。メソッド参照メソッド参照構文はオブジェクト::メソッド名です
同様に、メソッド参照メソッドを使用して機能インターフェイスインスタンスを作成する必要があります。メソッド署名の定義にも準拠する必要があります。ここでprintlnメソッドソースコードを参照してください
public void println(オブジェクトx){string s = string.valueof(x);同期(this){print(s); newline(); }}パラメーターを受信し、値を返さず、コンパイルします。
最後に、機能的なインターフェイスを作成する最後のタイプを見てみましょう。 3番目の方法:メソッド参照を構築し、プログラムの変更を継続します。
public class test1 {public static void main(string [] args){list <integer> list = arrays.aslist(1,2,3,4,5,6,7,8,9,10); //コンストラクターメソッドリファレンスリスト。Foreach(test1 :: new); } test1(integer i){system.out.println(i); }}コンストラクターが参照する構文は次のとおりです。クラス名:: new
TEST1に新しいコンストラクターを追加しました。これは、パラメーターを受信し、値を返さず、コンパイルします。 (コンストラクターの引用のみの使用を示すためだけに)
前の記事に基づいて、機能的なインターフェイスタイプを作成する3つの方法を要約できます。
1。ラムダの表現
2。メソッド引用
3。コンストラクターメソッド参照
注:どの方法に関係なく、メソッド署名は抽象的なメソッドに沿っている必要があります。