Java の例でのラムダ式の詳細な説明

WBOY
リリース: 2022-04-24 12:04:48
転載
2093 人が閲覧しました

この記事では、java に関する関連知識を提供します。主にラムダ式に関連する問題について紹介します。ラムダ式では、Java 言語の演算子が導入されています**" ->"**、この演算子はと呼ばれますラムダ演算子またはアロー演算子。見てみましょう。皆さんのお役に立てれば幸いです。

Java の例でのラムダ式の詳細な説明

推奨学習: 「java ビデオ チュートリアル 」 "

1. Lambda の最初の紹介

Java ではインターフェイスをインスタンス化できないことはわかっていますが、インターフェイス オブジェクトはその実装クラス オブジェクトを指すことができます。インターフェースに実装オブジェクトさえない場合はどうなるでしょうか?次のように匿名クラスを使用することもできます:

public class JavaTest {
    public static void main(String[] args) {
        Fly fly = new Fly() {
            @Override
            public void fly(String name) {
                System.out.println(name + "飞行");
            }
        };
        fly.fly("张三");
    }}interface Fly{
    abstract void fly(String name);}
ログイン後にコピー

ただし、匿名内部メソッドを使用すると、コードの量は実際にはそれほど簡潔ではありません。コードをより簡潔にするために、Java では Lambda が導入されました。 式の記述では、この機能を実現するために、より単純な構文が使用されます。ラムダ式を使用した簡略化されたコードは次のとおりです:

public class JavaTest {
    public static void main(String[] args) {
        Fly fly = name -> System.out.println(name + "飞行");
        fly.fly("张三");
    }}interface Fly{
    abstract void fly(String name);}
ログイン後にコピー

ラムダ式を使用しても同じ効果が得られますが、コードの量は合理化されます。これがラムダ式の魅力です。

2. 関数型インターフェイス

ラムダ式の構文を学ぶ前に、関数型インターフェイスが実装すべきメソッドが 1 つだけであることをまず知る必要がありますこのインターフェースを関数インターフェースと呼びます。

//接口中只有一个待实现的方法 fly,所以这是函数式接口interface Fly{
     void fly(String name);}//接口中有两个待实现的方法 这是不是函数式接口interface Run{
    void fastRun();
    void slowRun();}//接口中有两个方法,但其中一个是已经定义好的default方法,真正需要子类去实现的方法只有一个 这是函数式接口interface Jump{
    void jump();
    default void highJump(){
        System.out.println("跳的更高");
    }}
ログイン後にコピー

**@FunctionalInterface アノテーションをインターフェイスに追加して、インターフェイスが機能インターフェイスであることを主張できます。インターフェイスが機能インターフェイスでない場合、コンパイルでエラーが表示されます。
Java の例でのラムダ式の詳細な説明
関数型インターフェースとは何なのかを知る必要があるのはなぜですか?ラムダ式はインターフェイスの匿名クラス実装を簡素化するため、
関数型インターフェイスでのみ機能します**。
これは簡単に理解できますが、インターフェイスに実装するメソッドが複数ある場合、ラムダ式はインターフェイス内のどのメソッドを実装しているかを伝えることができません。

3. ラムダ式の構文

ラムダ式では、Java 言語の演算子 **"->"** が導入されます。これは、ラムダ演算子またはアロー演算子と呼ばれます。 。 Lambda を 2 つの部分に分割します。

左側: Lambda 式に必要なすべてのパラメータを指定します
右側: Lambda 本体、つまり Lambda 式によって実行される関数を定式化します。 。
このように:

(parameters) -> expression
或
(parameters) ->{ statements; }
ログイン後にコピー

-> とラムダ本体を除き、パラメータ、括弧、角括弧などのラムダ式の他のパラメータは、パラメータの型とメソッド本体のコードに基づいて省略できます。行番号です。
次の関数インターフェイスの実装を例に挙げます:

interface MathOperation {
        int operation(int a, int b);
    }

    interface GreetingService {
        void sayMessage(String message);
    }

    private int operate(int a, int b, MathOperation mathOperation){
        return mathOperation.operation(a, b);
    }
    
    interface NoParam{
        int returnOne();
    }
ログイン後にコピー

以下はラムダ式の重要な特性です:

  • オプションの型宣言 : Lambda 式では実装メソッドのパラメータの型を宣言する必要がなく、コンパイラはパラメータ値を均一に識別できます。
        // 类型声明
        MathOperation addition = (int a, int b) -> a + b;
        // 不用类型声明
        MathOperation subtraction = (a, b) -> a - b;
ログイン後にコピー
  • オプションのパラメータの括弧: パラメータを括弧で定義する必要はありませんが、パラメータを定義しないか複数のパラメータを括弧で定義する必要はありません。
      // 不用括号
        GreetingService greetService1 = message ->
                System.out.println("Hello " + message);

        // 用括号
        GreetingService greetService2 = (message) ->
                System.out.println("Hello " + message);
ログイン後にコピー
  • オプションの中括弧: 本文にステートメントが含まれる場合、中括弧は必要ありません。
     // 多条语句不可以省略大括号
        MathOperation multiplication = (int a, int b) -> {
            int num = a+1;
            num = a + b;
            return a * b + num;
        };

        // 单条语句可以省略大括号
        MathOperation pision = (int a, int b) -> a / b;
ログイン後にコピー
  • オプションの戻りキーワード: 本体に式の戻り値が 1 つしかない場合、コンパイラは自動的に値を返します。中括弧で式を指定する必要があります。 return. 数値。
  // 多条语句的Lambda表达式如果有返回值,需要使用return
        MathOperation multiplication = (int a, int b) -> {
            int num = a+1;
            num = a + b;
            return a * b + num;
        };

        // 单条语句可以省略return
        MathOperation pision = (int a, int b) -> a / b;
ログイン後にコピー

4. ラムダ式の使用範囲

ラムダ式は、匿名クラスの作成を簡略化するために使用されるだけでなく、さらに多くの用途があります。

1. 変数への値の代入

上記では、ラムダ式を使用して変数に値を代入していますが、これにより、匿名内部クラスの代入と、読書効率を向上させます。

MathOperation subtraction = (a, b) -> a - b;
ログイン後にコピー

2. 戻り結果として

interface MathOperation {
        int operation(int a, int b);
    }

    MathOperation getOperation(int a, int b){
        return (a1, b1) -> a+b;
    }
ログイン後にコピー

3. 配列要素として

MathOperation math[] = {
                (a,b) -> a+b,
                (a,b) -> a-b,
                (a,b) -> a*b        };
ログイン後にコピー

4. 通常のメソッドまたはコンストラクター メソッドのパラメーターとして

public static void main(String args[]){

        Java8Tester java8Tester = new Java8Tester();
        java8Tester.operate(1,2,((a, b) -> a*b));

    }

    private int operate(int a, int b, MathOperation mathOperation){
        return mathOperation.operation(a, b);
    }

    interface MathOperation {
        int operation(int a, int b);
    }
ログイン後にコピー

5. Scope ラムダ式のスコープ

ラムダ式の式本体内では、式本体の外にある変数にアクセスできますが、他の変数を変更することはできません。
Java の例でのラムダ式の詳細な説明

6. Lambda 式の参考記述方法

Lambda を学習していると、次のようなコードのような奇妙な書き方に出会うこともあります。

見たことのない記号がここに現れます:: この書き方をメソッド参照といいます。

明らかに、メソッド参照の使用は通常の Lambda 式よりも簡単です。

関数型インターフェイスの実装がたまたまメソッドを呼び出すことによって

実装された場合、メソッド参照を使用できます。

public class Java8Tester {


    public static void main(String args[]){

        // 静态方法引用--通过类名调用
        GreetingService greetingService = Test::MyNameStatic;
        greetingService.sayMessage("hello");
        Test t = new Test();
        //实例方法引用--通过实例调用
        GreetingService greetingService2 = t::myName;
        // 构造方法方法引用--无参数
        Supplier<test> supplier = Test::new;
        System.out.println(supplier.get());
    }



    interface GreetingService {
        void sayMessage(String message);
    }}class Test {
    // 静态方法
    public static void MyNameStatic(String name) {
        System.out.println(name);
    }

    // 实例方法
    public void myName(String name) {
        System.out.println(name);
    }

    // 无参构造方法
    public Test() {
    }}</test>
ログイン後にコピー

7、Lambda表达式的优缺点

优点:

  • 更少的代码行-lambda表达式的最大好处之一就是减少了代码量。我们知道,lambda表达式只能与功能接口一起使用。例如,Runnable 是一个接口,因此我们可以轻松地应用lambda表达式。

  • 通过将行为作为方法中的参数传递来支持顺序和并行执行-通过在Java 8中使用Stream API,将函数传递给collection方法。现在,集合的职责是以顺序或并行的方式处理元素。

  • 更高的效率-过使用Stream API和lambda表达式,可以在批量操作集合的情况下获得更高的效率(并行执行)。 此外,lambda表达式有助于实现集合的内部迭代,而不是外部迭代。

缺点

  • 运行效率-若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势)
  • 很难调试-Lambda表达式很难打断点,对调式不友好。
  • 不容易看懂-若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂(我学Lambda表达式的原因是看不懂同事写的Lambda表达式代码)

推荐学习:《java视频教程

以上がJava の例でのラムダ式の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!