Java 8 のラムダ式の簡単な分析: ラムダ式を使用する理由

不言
リリース: 2018-09-21 11:07:39
オリジナル
3387 人が閲覧しました

この記事の内容は、Java8 でラムダ式を使用する理由についての簡単な分析です。必要な方は参考にしていただければ幸いです。

ラムダ式は Java8 の最も人気のある機能です。人々は、完全なオブジェクト指向の命令型プログラミング言語である Java に関数型プログラミングの概念を導入しました。

関数型プログラミングがどのように機能するかについては、この記事の範囲を超えていますが、私たちがよく議論する OOP (オブジェクト指向プログラミング) とは明らかに異なる機能の 1 つを抽出します。 。

この記事では、ラムダ式とは正確には何なのか、そしてラムダ式が Java エコシステム全体にどのように適合するのかを学びます。また、ラムダ式を使用しないコードと、後でラムダを使用してリファクタリングしたサンプル コードを観察して比較します。

ラムダ式について理解する

ラムダ式は、渡して実行できるコードの一部です。私たち Java プログラマーは、コードの一部を関数に渡すことに慣れていません。私たちの習慣は、以下に示すように、定義されたコードをメソッド本体にカプセル化し、オブジェクト参照を通じて実行することです。

public class LambdaDemo {
    public void printSomething(String something) {
        System.out.println(something);
    }
    public static void main(String[] args) {
        LambdaDemo demo = new LambdaDemo();
        String something = "I am learning Lambda";
        demo.printSomething(something);
    }
}
ログイン後にコピー

これは古典的な OOP 開発パラダイムです。 style はメソッドの実装を呼び出し元から隠します。呼び出し元は変数をメソッドに渡すだけで、メソッドは変数に対して何らかの操作を実行して別の変数値を返すか、この例のように副作用を生成します。

次に、変数の受け渡しの代わりに動作の受け渡しを使用する同等の実装を見ていきます。これを行うには、メソッドの抽象化ではなく動作を定義する関数インターフェイスを作成する必要があります。関数型インターフェイスは、メソッドが 1 つだけあるインターフェイスです。

public class LambdaDemo {
    interface Printer {
        void print(String val);
    }
    public void printSomething(String something, Printer printer) {
        printer.print(something);
    }
}
ログイン後にコピー

上記のコード実装では、Printer インターフェイスがすべての印刷操作を担当します。 printSomething メソッドは動作を定義しなくなりましたが、Printer:

public static void main(String[] args) {
    LambdaDemo demo = new LambdaDemo();
    String something = "I am using a Functional interface";
    Printer printer = new Printer() {
        @Override
        public void print(String val) {
            System.out.println(val);
        }
    };
    demo.printSomething(something, printer);
}
ログイン後にコピー

によって定義された動作を実行します。観察力の高い読者なら、ここでは何も新しいことは行われていないことに気づいたかもしれません。まだラムダ式に適用していないため、これは当てはまります。 Printer インターフェイスの具体的な実装を作成し、それを printSomething メソッドに渡すだけです。

上記の例は、Java にラムダ式を導入するという重要な目標をもたらすことを目的としています。

ラムダ式は、もともと関数インターフェイスのインライン実装を定義するために使用されていました。

Beforeラムダ式を使用して上記の例を再構成します。必要な構文の知識を学びましょう:

(param1,param2,param3...,paramN) - > {//代码块;}
ログイン後にコピー

a ラムダ式の構成は、括弧で囲まれたパラメータ リストです。通常はメソッド宣言で定義するカンマで区切られ、その後に実行されるコードを指す矢印が続きます。次に、ラムダを使用して上記のコードをリファクタリングしましょう。

public static void main(String[] args) {
    LambdaDemo demo = new LambdaDemo();
    String something = "I am learning Lambda";
    /**/
    Printer printer = (String toPrint)->{System.out.println(toPrint);};
    /**/
    demo.printSomething(something, printer);
}
}
ログイン後にコピー

これは非常にコンパクトで美しく見えます。関数型インターフェイスはメソッドを 1 つだけ宣言するため、ラムダの最初の部分で渡されるパラメーターはメソッドのパラメーター リストに自動的にマップされ、矢印の右側のコードがメソッドの特定の実装とみなされます。

ラムダ式を使用する理由

前の例と同様、ラムダ式を使用すると、読みやすく、理解しやすい、よりコンパクトなコードを作成できます。このアプローチにはパフォーマンスとマルチコア処理の点で他にも利点がありますが、それらは Streams API を理解した後にのみ適用されるため、この記事の範囲を超えています。

main メソッドをラムダありとなしで比較すると、コードが突然短くなり、ラムダ式の威力が実際にわかります。

public static void main(String[] args) {
    LambdaDemo demo = new LambdaDemo();
    String something = "I am learning Lambda";
    /**/
    Printer printer = (String toPrint)->{System.out.println(toPrint);};
    /**/
    demo.printSomething(something, printer);
}
ログイン後にコピー

コードをここに示されているものよりも簡潔にすることもできます。この場合、矢印の左側でパラメータの型を指定する必要さえなく、その型はインターフェイス メソッドの仮パラメータに基づいてコンパイラによって推測されます。

Printer printer = (toPrint)->{System.out.println(toPrint);};
ログイン後にコピー

もっと改善できるはずです。 lambda のもう 1 つの特徴は、パラメーターが 1 つしかない場合、括弧を完全に削除できることです。同様に、矢印の右側にステートメントが 1 つだけある場合は、中括弧を削除することもできます。

Printer printer = toPrint -> System.out.println(toPrint);
ログイン後にコピー

コードはとてもかわいく見えますが、私たち それはまだ始まりにすぎません。インターフェイス メソッドにパラメーターが必要ない場合は、life を空のかっこのペアに置き換えることができます。

() -> System.out.println("anything");
ログイン後にコピー

ラムダをインライン化するだけの場合最初にオブジェクトを作成して、それをsaySomething メソッドに渡さずに作業を開始します:

public static void main(String[] args) {
    LambdaDemo demo = new LambdaDemo();
    String something="I am Lambda";    /**/
    demo.printSomething(something, toPrint -> System.out.println(toPrint));
}
ログイン後にコピー

今、私たちは関数型プログラミングについて実際に話しています。メイン関数本体のコードは 9 行から 3 行に減りました。このようなコンパクトなコードにより、ラムダ式は Java プログラマにとって非常に魅力的なものになります。

以上がJava 8 のラムダ式の簡単な分析: ラムダ式を使用する理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート