JAVA 8 Lambda表达式-Lambda Expressions

╰半夏微凉° 2021-06-24 15:59 634阅读 0赞

Lambda表达式是在java规范提案JSR 335中定义的,Java 8 中引入了Lambda表达式,并被认为是Java 8最大的新特性,Lambda表达式促进了函数式编程,简化了Java编程开发。

1、背景介绍:

1)匿名内部类:

在Java中,匿名内部类一般适用于那些在Java应用中只会出现一次的实现类,举个例子,在标准的Swing或JavaFX应用中,有很多键盘和鼠标的事件处理程序,一般情况下,你不需要写一个单独的事件处理类,而是使用如下方式(有Swing编程经验的应该很熟悉吧)

  1. JButton testButton = new JButton("Test Button");
  2. testButton.addActionListener(new ActionListener()
  3. {
  4. @Override
  5. public void actionPerformed(ActionEvent ae)
  6. {
  7. System.out.println("Click Detected by Anon Class");
  8. }
  9. });

不这样做的话,你需要针对每一个事件写一个单独的ActionListener接口的实现类,这样的代码并不优雅,因为仅仅为了定义一个方法就需要附加写一大堆的代码。通常,哪里需要,就在哪里创建对应的匿名内部类,这样的代码可读性会更强。

2)函数式接口:

在Java 8中,如果一个接口只有一个抽象方法,我们成为函数式接口。在java8之前,我们可以使用匿名内部类来去实现这样的接口,在java8后,对于函数式接口通常使用lambda来实现。

  1. testButton.addActionListener((e) ->
  2. {
  3. System.out.println("Click Detected by Anon Class");
  4. });

2、Lambda表达式语法:

  1. parameter -> expression body

主要组成:参数列表 + 箭头 + 表达式体,如 (int x, int y) -> x + y

其中,表达式体可以是一条表达式,也可以是一个语句块(多条代码语句);

Lambda表达式具有如下特征:

  • 【可选】类型声明:参数的类型不需要声明,编译器可以根据参数值推断出其类型;
  • 【可选】括号:单个参数的话,不需要用圆括号包围参数,当然,对于多个参数或无参数的话,括号是需要的;
  • 【可选】花括号:如果表达式主体只有一条语句的话,不需要用花括号包围,当然,对于多条语句,花括号是需要的;
  • 【可选】return关键字:如果表达式主体是单一表达式,return关键字可以不写,编译器可以自动返回该值,当然,如果写了return,则需要加上花括号;

    package lambda;

    /**

    • LambdaTest
    • @author Pi Chen
    • @version V1.0.0, 2016年9月19日
    • @see
    • @since V1.0.0
      */
      public class LambdaTest
      {
      public static void main(String args[])
      {

      1. LambdaTest tester = new LambdaTest();
      2. // 有参数类型
      3. MathOperation addition = (int a, int b) -> a + b;
      4. // 无参数类型
      5. MathOperation subtraction = (a, b) -> a - b;
      6. // 有花括号,有return关键字
      7. MathOperation multiplication = (int a, int b) -> {
      8. return a * b;
      9. };
      10. // 无花括号,无return关键字,单一表达式情况
      11. MathOperation division = (int a, int b) -> a / b;
      12. // MathOperation调用示例
      13. System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      14. System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      15. System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      16. System.out.println("10 / 5 = " + tester.operate(10, 5, division));
      17. // 有括号
      18. GreetingService greetService1 = message -> System.out.println("Hello " + message);
      19. // 无括号,单个参数情况
      20. GreetingService greetService2 = (message) -> System.out.println("Hello " + message);
      21. // GreetingService调用示例
      22. greetService1.sayMessage("Mahesh");
      23. greetService2.sayMessage("Suresh");
      24. //有括号, 无参情况
      25. Runnable runTest = () -> System.out.println("Running");
      26. //Runnable调用示例
      27. runTest.run();

      }

      // 内部接口
      interface MathOperation
      {

      1. int operation(int a, int b);

      }

      interface GreetingService
      {

      1. void sayMessage(String message);

      }

      interface Runnable
      {

      1. void run();

      }

      private int operate(int a, int b, MathOperation mathOperation)
      {

      1. return mathOperation.operation(a, b);

      }
      }

说明:

  • Lambda表达式主要用于定义一个函数式接口(functional interface:一个只包含一个抽象方法的接口)的内联实现,在上面的例子中,我们使用了各种类型的Lambda表达式来实现MathOperation接口的operation方法,接着又实现了GreetingService接口的sayMessage方法,Runnable接口的run方法;
  • Lambda表达式消除了匿名类的使用并且赋予Java简单且强大的函数式编程能力;

发表评论

表情:
评论列表 (有 0 条评论,634人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java 8 Lambda 表达式

    1.Lambda 表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函数作为参数传

    相关 Java 8-Lambda表达式

    行为参数化 行为参数化:让方法接受多种行为作为参数,并在内部使用,来完成不同的行为。 行为参数化可让代码更好地适应不断变化的要求,减轻未来的工作量。 传递代码,就

    相关 Java 8 Lambda 表达式

      最近频繁的看到一个技术:Lambda 表达式   貌似下个项目要用到这个技术,就来学习一下。   `Java8`新特性引入了一个新的操作符`->`

    相关 Java 8 Lambda 表达式

    Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用 Lamb...