ホームページ Java &#&ベース Java 8 の糖衣構文であるラムダ式の紹介

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

Feb 18, 2021 pm 06:09 PM
java8 lambda

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 サイトの他の関連記事を参照してください。

    • このウェブサイトの声明
      この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

      ホットAIツール

      Undresser.AI Undress

      Undresser.AI Undress

      リアルなヌード写真を作成する AI 搭載アプリ

      AI Clothes Remover

      AI Clothes Remover

      写真から衣服を削除するオンライン AI ツール。

      Undress AI Tool

      Undress AI Tool

      脱衣画像を無料で

      Clothoff.io

      Clothoff.io

      AI衣類リムーバー

      Video Face Swap

      Video Face Swap

      完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

      ホットツール

      メモ帳++7.3.1

      メモ帳++7.3.1

      使いやすく無料のコードエディター

      SublimeText3 中国語版

      SublimeText3 中国語版

      中国語版、とても使いやすい

      ゼンドスタジオ 13.0.1

      ゼンドスタジオ 13.0.1

      強力な PHP 統合開発環境

      ドリームウィーバー CS6

      ドリームウィーバー CS6

      ビジュアル Web 開発ツール

      SublimeText3 Mac版

      SublimeText3 Mac版

      神レベルのコード編集ソフト(SublimeText3)

      ラムダ式は C++ の例外をどのように処理しますか? ラムダ式は C++ の例外をどのように処理しますか? Apr 17, 2024 pm 12:42 PM

      C++ では、Lambda 式を使用して例外を処理する方法が 2 つあります。try-catch ブロックを使用して例外をキャッチする方法と、catch ブロックで例外を処理または再スローする方法です。 std::function 型のラッパー関数を使用すると、その try_emplace メソッドで Lambda 式の例外をキャッチできます。

      Java 8で1年前または1年後の日付を計算するにはどうすればよいですか? Java 8で1年前または1年後の日付を計算するにはどうすればよいですか? Apr 26, 2023 am 09:22 AM

      Java8 は、minus() メソッドを使用して 1 年前の日付または 1 年後の日付を計算し、1 年前の日付を計算します。 packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[ ]args ){LocalDatetoday=LocalDate.now();LocalDateprevious Year=today.minus(1,ChronoUni

      C++ ラムダ式におけるクロージャの意味は何ですか? C++ ラムダ式におけるクロージャの意味は何ですか? Apr 17, 2024 pm 06:15 PM

      C++ では、クロージャは外部変数にアクセスできるラムダ式です。クロージャを作成するには、ラムダ式の外部変数をキャプチャします。クロージャには、再利用性、情報の隠蔽、評価の遅延などの利点があります。これらは、イベント ハンドラーなど、外部変数が破棄されてもクロージャが外部変数にアクセスできる現実の状況で役立ちます。

      マルチスレッド プログラミングに C++ ラムダ式を使用する利点は何ですか? マルチスレッド プログラミングに C++ ラムダ式を使用する利点は何ですか? Apr 17, 2024 pm 05:24 PM

      C++ マルチスレッド プログラミングにおけるラムダ式の利点には、シンプルさ、柔軟性、パラメータの受け渡しの容易さ、並列処理が含まれます。実際のケース: ラムダ式を使用してマルチスレッドを作成し、異なるスレッドでスレッド ID を出力します。これは、このメソッドのシンプルさと使いやすさを示しています。

      C++ラムダ式でクロージャを実装するにはどうすればよいですか? C++ラムダ式でクロージャを実装するにはどうすればよいですか? Jun 01, 2024 pm 05:50 PM

      C++ ラムダ式は、関数スコープ変数を保存し、関数からアクセスできるようにするクロージャーをサポートしています。構文は [キャプチャリスト](パラメータ)->戻り値の型{関数本体} です。 Capture-list は、キャプチャする変数を定義します。[=] を使用してすべてのローカル変数を値によってキャプチャするか、[&] を使用してすべてのローカル変数を参照によってキャプチャするか、[variable1, variable2,...] を使用して特定の変数をキャプチャできます。ラムダ式はキャプチャされた変数にのみアクセスできますが、元の値を変更することはできません。

      C++ ラムダ式はどのようにして外部変数をキャプチャするのでしょうか? C++ ラムダ式はどのようにして外部変数をキャプチャするのでしょうか? Apr 17, 2024 pm 04:39 PM

      C++ で外部変数のラムダ式をキャプチャするには、次の 3 つの方法があります。 値によるキャプチャ: 変数のコピーを作成します。参照によるキャプチャ: 変数参照を取得します。値と参照による同時キャプチャ: 値または参照による複数の変数のキャプチャを許可します。

      C++ 関数呼び出しのラムダ式: パラメーターの受け渡しと戻り値のコールバックの最適化 C++ 関数呼び出しのラムダ式: パラメーターの受け渡しと戻り値のコールバックの最適化 May 03, 2024 pm 12:12 PM

      C++ では、ラムダ式を関数パラメータとして使用して、コールバック関数の柔軟性を実現できます。具体的には: パラメーターの受け渡し: std::function を介して Lambda 式をラップし、関数ポインターの形式で関数に渡します。戻り値の処理: std::functionでコールバック関数のポインタを宣言する際の戻り値の型を指定します。実践的なケース: GUI イベント処理のコールバックを最適化し、不要なオブジェクトや関数ポインターの作成を回避し、コードの単純さと保守性を向上させます。

      Java 8を使用して1週間後の日付を計算するにはどうすればよいですか? Java 8を使用して1週間後の日付を計算するにはどうすればよいですか? Apr 21, 2023 pm 11:01 PM

      Java8 で 1 週間後の日付を計算する方法 この例では、1 週間後の日付を計算します。 LocalDate 日付には時間情報が含まれません。その plus() メソッドは、日、週、月を追加するために使用されます。これらの時間単位は ChronoUnit クラスで宣言されます。 LocalDate も不変型なので、戻った後に変数を使用して値を割り当てる必要があります。 packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo08{publicstaticvoidmain(String[

      See all articles