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

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で複製されています。侵害がある場合は、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

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

      DVWA

      DVWA

      Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

      ZendStudio 13.5.1 Mac

      ZendStudio 13.5.1 Mac

      強力な PHP 統合開発環境

      WebStorm Mac版

      WebStorm Mac版

      便利なJavaScript開発ツール

      SublimeText3 Mac版

      SublimeText3 Mac版

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