Java 8 の糖衣構文であるラムダ式の紹介

coldplay.xixi
リリース: 2021-02-18 18:09:05
転載
2839 人が閲覧しました

Java 8 の糖衣構文であるラムダ式の紹介

#無料学習の推奨事項:

java 基本チュートリアル

##1. ラムダ式の概要


ラムダ式は Java8 の新機能であり、Java8 で最も学ぶ価値のある新機能の 1 つです。 (もう 1 つの新機能はフロー プログラミングです。)

    ラムダ式は本質的に、
  • 匿名メソッド

    です。この匿名メソッドを使用して、インターフェースにメソッドを 実装できます。

    関数: ラムダ式は通常、
  • インターフェイスの実装を簡素化するために使用されます
  • 。インターフェースの実装には、①インターフェースの実装クラスを設計する、②匿名内部クラスを使用するなど、さまざまな方法があります。ただし、この 2 つの方法よりも、③のラムダ式を使用する方が簡単です。

    要件: ラムダ式、
  • 関数型インターフェイスのみ実装可能
  • : つまり、インターフェイスには、実装クラスが実装する必要がある抽象メソッドが 1 つだけあります。

@FunctionalInterface アノテーション
は、インターフェイスの前に使用され、インターフェイスが機能インターフェイスであるかどうかを判断するために使用されます。機能するインターフェイスではない場合、エラーが報告されます。この機能は @Override に似ています。

2. ラムダ式の構文

ラムダ式は本質的に匿名メソッドであるため、ラムダ式を作成するときは必要ありません。メソッド名が何であるかだけでよく、戻り値の型を気にする必要はありません。注意する必要があるのは、

パラメータ リスト

メソッド本体の 2 つの部分だけです。

() パラメータ部分: メソッドのパラメータ リストは、パラメータの数とタイプを含め、実装されたインターフェイスのメソッド パラメータ部分と一致している必要があります。
    {}メソッド本体部: メソッドの実装部分。インターフェースで定義したメソッドに戻り値がある場合は、戻り値に注意して実装してください。
  • -> : パラメータ部分とメソッド本体部分を分離します。
Lambda表达式基础语法:(参数) ->{
	方法体}
ログイン後にコピー
  • 以下では、異なるパラメーターと戻り値を持つ 6 種類の 関数インターフェース
    を定義し、ラムダ式を使用してインターフェースにメソッドを実装します。

    Java 8 の糖衣構文であるラムダ式の紹介#以下は、上記の 6 つの関数インターフェイスのラムダ式の実装です。

    /**
     * @Description:
     * @author Guoqianliang
     * @date 19:50 - 2021/2/15
     */public class BasicSyntax {
        public static void main(String[] args) {
            // 1.实现无参数,无返回值的函数式接口
            NoneReturnNoneParameter lambda1 = () -> {
                System.out.println("这是无参,无返回值的方法");
            };
            lambda1.test();
    
            // 2.实现一个参数,无返回值的函数式接口
            NoneReturnSingleParameter lambda2 = (int a) -> {
                System.out.println("这是一个参数,无返回值的方法,参数a:" + a);
            };
            lambda2.test(10);
    
            // 3.实现多个参数,无返回值的函数式接口
            NoneReturnMutipleParameter lambda3 = (int a, int b) -> {
                System.out.println("这是多个参数,无返回值的方法,参数a=" + a + ",b=" + b);
            };
            lambda3.test(10, 20);
    
            // 4.实现无参数,有返回值有返回值的函数式接口
            SingleReturnNoneParameter lambda4 = () -> {
                System.out.println("这是无参数,有返回值的方法,返回值是:");
                return 10;
            };
            System.out.println(lambda4.test());
    
            // 5.实现一个参数,有返回值的函数式接口
            SingleReturnSingleParameter lambda5 = (int a) -> {
                System.out.println("这是一个参数,有返回值的方法,返回值是:");
                return a;
            };
            System.out.println(lambda5.test(10));
    
            // 6.实现多个参数,有返回值的函数式接口
            SingleReturnMutipleParameter lambda6 = (int a, int b) -> {
                System.out.println("这是多个参数,有返回值的方法,返回值是:");
                return a + b;
            };
            System.out.println(lambda6.test(1, 2));
        }}
    ログイン後にコピー

    構文の簡略化と高度化:

    パラメータ リストのパラメータ タイプは省略できます。

      パラメータ リストにパラメータが 1 つだけある場合は、括弧を省略できます。
    • メソッド本体にステートメントが 1 つだけある場合は、中括弧を省略できます。 (注: このステートメントが return ステートメントである場合、中括弧を省略した後、return キーワードも省略する必要があります)
    • #3. 関数リファレンス

    # #Lambda 式はインターフェイスを簡素化するためのものです。ラムダ式では、より複雑なロジックを使用しないでください。処理する必要があるロジックが比較的複雑な場合は、通常、別のメソッドが作成されます。このメソッドをラムダ式で直接参照するだけです。つまり、 は既存のメソッドを参照するため、ラムダ式を置き換えてインターフェイスの実装を完了できます。

    #1. 静的メソッドのリファレンス

    構文:

    Class::静的メソッド

    引用されたメソッドの後にかっこを追加しないでください。

    参照されるメソッド、パラメータ (数値、型)、および戻り値は、インターフェイスで定義されているものと一致している必要があります。

      /**
       * @Description: 方法引用
       * @author Guoqianliang
       * @date 0:26 - 2021/2/16
       */public class Lambda1 {
      
          private static interface Calculate {
              int calculate(int a, int b);
          }
      
          private static int calculate(int x, int y) {
              if (x > y) {
                  return x - y;
              } else if (x 
      ログイン後にコピー
    • 2. 非静的メソッドのリファレンス
    • 構文:

      Object::非静的メソッド

      引用符で囲まれたメソッドの後にかっこを追加しないでください。

      参照されるメソッド、パラメータ (数値、型)、および戻り値は、インターフェイスで定義されているものと一致している必要があります。

      #
      /**
       * @Description: 方法引用
       * @author Guoqianliang
       * @date 0:26 - 2021/2/16
       */public class Lambda1 {
      
          private static interface Calculate {
              int calculate(int a, int b);
          }
      
          // 非静态方法
          private int calculate2(int a, int b) {
              if (a != b) {
                  return a - b;
              }
              return a + b;
          }
      
          public static void main(String[] args) {
              // 非静态方法引用
              Calculate calculate2 = new Lambda1()::calculate2;
              System.out.println(calculate.calculate(10, 20));
          }}
      ログイン後にコピー
      • 3. コンストラクター メソッドのリファレンス
      構文:
      クラス名::new

      インターフェイス内のメソッドのパラメーターを通じて、さまざまなコンストラクター メソッドを区別できます。

      関数型インターフェイスで定義されたメソッドが、クラスのオブジェクトを取得するだけの場合。この時点で、コンストラクター メソッドへの参照を使用して、このメソッドの実装を簡素化できます。

      /**
       * @Description: 构造方法引用
       * @author Guoqianliang
       * @date 11:20 - 2021/2/16
       */public class Lambda2 {
      
          @FunctionalInterface
          private interface GetPersonWithNoneParameter {
              Person get();
          }
      
          @FunctionalInterface
          private interface GetPersonWithSingleParameter {
              Person get(String name);
          }
      
          @FunctionalInterface
          private interface GetPersonWithMutipleParameter {
              Person get(String name, int age);
          }
      
          private static class Person {
              String name;
              int age;
      
              public Person() {
                  System.out.println("Person类的无参构造方法执行了");
              }
      
              public Person(String name) {
                  this.name = name;
                  System.out.println("Person类的有参构造方法执行了");
              }
      
              public Person(String name, int age) {
                  this.name = name;
                  this.age = age;
                  System.out.println("Person类的两个参数的构造方法执行了");
              }
          }
      
          public static void main(String[] args) {
              // 1.使用lambda表达式,实现GetPersonWithNoneParameter接口
              GetPersonWithNoneParameter getPerson = Person::new;
              // 2.使用lambda表达式,实现GetPersonWithSingleParameter接口
              GetPersonWithSingleParameter getPerson2 = Person::new;
              // 3.使用lambda表达式,实现GetPersonWithMutipleParameter接口
              GetPersonWithMutipleParameter getPerson3 = Person::new;
      
              System.out.println(getPerson.get());
              System.out.println(getPerson2.get("树先生"));
              System.out.println(getPerson3.get("你好", 23));
          }}
      ログイン後にコピー
      • 4. オブジェクト メソッドへの特別な参照
      ラムダ式を使用して特定のインターフェイスを実装する場合、ラムダ式に次のものが含まれている場合メソッド本体で、このオブジェクトを直接使用してメソッドの 1 つを呼び出すと、全体的なロジックを完成させることができます。

      /**
       * @Description: 对象方法的特殊应用
       * @author Guoqianliang
       * @date 11:54 - 2021/2/16
       */public class Lambda3 {
      
          @FunctionalInterface
          private interface MyInterface {
              // String get(Person person);
              void set(Person person, String name);
          }
      
          private static class Person {
              private String name;
      
              public void setName(String name) {
                  this.name = name;
              }
      
              public String getName() {
                  return name;
              }
          }
      
          public static void main(String[] args) {
              Person p1 = new Person();
              p1.setName("小明");//        逻辑实现只是为了获取到对象的名字//        MyInterface lambda2 = Person::getName;//        System.out.println(lambda2.get(p1));
              
              // 逻辑实现只是为了给对象的某些属性进行赋值
              MyInterface lambda1 = (x, n) -> x.setName(n);
              MyInterface lambda2 = Person::setName;
              lambda2.set(p1, "李华");
              System.out.println(p1.getName());
          }}
      ログイン後にコピー
      4. ラムダ式で注意すべき問題

      ローカル変数

      を使用する場合、それらは次のように宣言されます。デフォルト 定数のため、値は変更できません。

      /**
       * @Description:
       * @author Guoqianliang
       * @date 13:05 - 2021/2/16
       */public class Lambda4 {
          public static void main(String[] args) {
              // 1.定义一个局部变量
              int x = 10;
              // 2.使用lambda表达式实现接口
              LambdaTest lambda = () -> {
                  System.out.println("x=" + x);
              };
              // 3. 无法修改常量x
              // x=20;
          }}@FunctionalInterfaceinterface LambdaTest {
          void test();}
      ログイン後にコピー

      関連する学習の推奨事項:

      Java の基礎

      以上がJava 8 の糖衣構文であるラムダ式の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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