序文
禿げた頭だけが強くなることができます。
テキストは私のGitHubリポジトリに含まれています。スターへようこそ:https://github.com/ZhongFuCheng3y/3y真
秋フェスティバルの間に上海に行き、外灘にカードを打ちました:
その後、外灘はJavaでの機能プログラミングについて学び、それをすべての人のために整理し、一緒に勉強しました。
1つ、ラムダの使用法
以前にOptionalクラスを作成したときに、Lambdaの使用方法について簡単に説明しました。これがレビューです。Lambdaの構文は次のようになります。
構文は
ラムダにスレッドと匿名内部クラスを作成するための構文を区別するためにスレッドを作成する(コードは明らかにはるかに少ないです!):
public static void main(String[] args) {
// 用匿名内部类的方式来创建线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("公众号:Java3y---关注我!");
}
});
// 使用Lambda来创建线程
new Thread(() -> System.out.println("公众号:Java3y---关注我!"));
}
Lambda式を使用すると、実際にはインターフェイスのインスタンスオブジェクトが作成されます。
Runnableオブジェクトインスタンス
アイコンを返します。例としてRunnableインターフェイス:
Runnableインターフェイスを例にとると、
Labmda式を使用するには、機能的なプログラミングインターフェイスが必要です。たとえば、Runnableインターフェイスでは、@ FunctionalInterfaceアノテーションを確認できます(このインターフェイスには1つの抽象メソッドしかないことを示しています)。
機能プログラミングインターフェイスには、1つの抽象的なメソッドしかありません
1.1機能プログラミングインターフェース
上記のコード例からわかるように、Lambda式を使用してスレッドを作成する場合、インターフェイス名、メソッド名、およびパラメーター名は関係ありません。彼のパラメータタイプ、パラメータの数、および戻り値にのみ注意を払います。
JDKは、使用できるいくつかの機能的なプログラミングインターフェイスをネイティブに提供します。一般的に使用されるインターフェイスは次のとおりです。
一般的に使用される機能プログラミングインターフェイスの
簡単な説明:
- テーブル手段内の単項インタフェースが一つだけ存在することを
、入力2つのがあることパラメータ、及びバイナリインタフェース手段の入力パラメータは。の例としてBiFunctionを取る
一般的に使用される機能インターフェース
デモ:
// Consumer 一个入参,无返回值
Consumer<String> consumer = s-> System.out.println(s);
consumer.accept("Java3y");
// Supplier 无入参,有返回值
Supplier<String> supplier = () -> "Java4y";
String s = supplier.get();
System.out.println(s);
//.....
Lambdaを使用する場合、覚えておくべきことが2つあります。
- Lambdaはインターフェイスのインスタンスオブジェクトを返します
- パラメータはありますか、パラメータはいくつありますか、戻り値があるかどうか、戻り値のタイプは何ですか->独自の適切な機能インターフェイスを選択してください
1.2メソッドリファレンス
ラムダを学ぶとき、次のコードのような奇妙な書き方を見つけるかもしれません。
// 方法引用写法
Consumer<String> consumer = System.out::println;
consumer.accept("Java3y");
通常のラムダの記述に従うと、次のようになります。
// 普通的Lambda写法
Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("Java3y");
明らかに、メソッド参照の使用は、通常のLambda式よりも少し簡潔です。
メソッドを呼び出すことによって機能インターフェイスの実装が達成された場合は、メソッドリファレンスを使用できます。
機能インターフェイスの実現は、メソッドを呼び出して
メソッド参照を実現することで発生する可能性があり、いくつかのタイプがあります。
- 静的メソッドのメソッドリファレンス
- 非静的メソッドのメソッドリファレンス
- コンストラクター
メソッドリファレンスのメソッドリファレンスデモ:
public class Demo {
public static void main(String[] args) {
// 静态方法引用--通过类名调用
Consumer<String> consumerStatic = Java3y::MyNameStatic;
consumerStatic.accept("3y---static");
//实例方法引用--通过实例调用
Java3y java3y = new Java3y();
Consumer<String> consumer = java3y::myName;
consumer.accept("3y---instance");
// 构造方法方法引用--无参数
Supplier<Java3y> supplier = Java3y::new;
System.out.println(supplier.get());
}
}
class Java3y {
// 静态方法
public static void MyNameStatic(String name) {
System.out.println(name);
}
// 实例方法
public void myName(String name) {
System.out.println(name);
}
// 无参构造方法
public Java3y() {
}
}
結果は次のとおりです。
結果
やっと
ラムダのコードは簡潔に見えますが、複雑であるかどうかを理解するのは困難です。
Lambdaを学習するときは、最初に、一般的に使用される機能プログラミングインターフェイスと、これらの機能プログラミングインターフェイスの違い(パラメーターの数、戻り値のタイプ)を知る必要があります。
Lambda式は、インターフェイスオブジェクトのインスタンスを返します。機能インターフェイスの実装がメソッドの呼び出しによって達成された場合、Lambda式の代わりにメソッド参照を使用できます。
最後に、完全な例を挙げてください。
// Supplier是一个无入参带返回的值的函数式编程接口
// () -> new Java3y()这整句Lambda表达式,返回的是Supplier接口的实例。从Lambda表达式可以看出无参数,带返回值
Supplier<Java3y> supplier = () -> new Java3y();
// 由于这个“() -> new Java3y()”Lambda表达式可以通过调用一个方法就实现了,那么我们可以优化成方法引用
Supplier<Java3y> supplier2 = Java3y::new;
公開番号記事のナビゲーション:2年間のハードワーク!
200以上のオリジナル記事技術記事
膨大なビデオリソース
絶妙なマインドマップ
顔の質問
プレススキャンコードは、
視聴と共有の取得について懸念している可能性があります私にとって非常に重要です!