検索
ホームページ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 までご連絡ください。
      lambda 表达式在 C++ 中如何处理异常?lambda 表达式在 C++ 中如何处理异常?Apr 17, 2024 pm 12:42 PM

      在C++中,使用Lambda表达式处理异常有两种方法:使用try-catch块捕获异常,并在catch块中处理或重新抛出异常。使用std::function类型的包装函数,其try_emplace方法可以捕获Lambda表达式中的异常。

      Java 8中如何计算一年前或一年后的日期?Java 8中如何计算一年前或一年后的日期?Apr 26, 2023 am 09:22 AM

      Java8计算一年前或一年后的日期利用minus()方法计算一年前的日期packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();LocalDatepreviousYear=today.minus(1,ChronoUni

      用 C++ lambda 表达式实现多线程编程的优势是什么?用 C++ lambda 表达式实现多线程编程的优势是什么?Apr 17, 2024 pm 05:24 PM

      lambda表达式在C++多线程编程中的优势包括:简洁性、灵活性、易于传参和并行性。实战案例:使用lambda表达式创建多线程​​,在不同线程中打印线程ID,展示了该方法的简洁和易用性。

      C++ lambda 表达式如何捕获外部变量?C++ lambda 表达式如何捕获外部变量?Apr 17, 2024 pm 04:39 PM

      在C++中捕获外部变量的lambda表达式有三种方法:按值捕获:创建一个变量副本。按引用捕获:获得变量引用。同时按值和引用捕获:允许捕获多个变量,按值或按引用。

      如何使用Java 8计算一周后的日期?如何使用Java 8计算一周后的日期?Apr 21, 2023 pm 11:01 PM

      Java8如何计算一周后的日期这个例子会计算一周后的日期。LocalDate日期不包含时间信息,它的plus()方法用来增加天、周、月,ChronoUnit类声明了这些时间单位。由于LocalDate也是不变类型,返回后一定要用变量赋值。packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo08{publicstaticvoidmain(String[

      如何使用 C++ lambda 表达式执行延迟求值?如何使用 C++ lambda 表达式执行延迟求值?Apr 17, 2024 pm 12:36 PM

      如何使用C++lambda表达式执行延迟求值?使用lambda表达式创建延迟求值的函数对象。延迟计算推迟到需要时才执行。仅当需要时才计算结果,提高性能。

      使用 C++ lambda 表达式有哪些注意事项?使用 C++ lambda 表达式有哪些注意事项?Apr 17, 2024 pm 12:15 PM

      使用C++lambda表达式时需注意:小心捕获变量,避免意外修改。可通过引用或值捕获变量,引用捕获用于修改外部变量。lambda表达式生命周期与捕获它的函数不同,可能导致内存泄漏。考虑使用函数指针或函数对象以优化性能。

      C++ lambda 表达式的返回值类型如何定义?C++ lambda 表达式的返回值类型如何定义?Apr 17, 2024 pm 04:15 PM

      在C++中,Lambda表达式的返回值类型通过->return-type指定,允许明确定义lambda的返回值。通过指定返回值类型,可以增强代码的可读性并避免编译器自动推断类型带来的潜在错误。

      See all articles

      ホット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衣類リムーバー

      AI Hentai Generator

      AI Hentai Generator

      AIヘンタイを無料で生成します。

      ホットツール

      SAP NetWeaver Server Adapter for Eclipse

      SAP NetWeaver Server Adapter for Eclipse

      Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

      ZendStudio 13.5.1 Mac

      ZendStudio 13.5.1 Mac

      強力な PHP 統合開発環境

      MantisBT

      MantisBT

      Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

      Safe Exam Browser

      Safe Exam Browser

      Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

      SublimeText3 Mac版

      SublimeText3 Mac版

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