Back

Lambda表达式

Lambda表达式的创建与使用

Lamda表达式

  • Lambda表达式,可以称为闭包,它是推动Java8发动的最重要新特性

  • Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)

  • 为什么要使用Lambda表达式

    • 可以避免匿名内部类定义过多
    • 可以让你的代码看起来更加简洁
    • 去掉了一堆没有意义的代码,只留下核心的逻辑
  • 基本语法

    (parameters)->expression[表达式];
    (parameters)->statement[语句];
    (parameters)->{statement};
    
  • 函数式接口(Functional Interface)是学习Lambda表达式的关键所在。其定义为:

    • 任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。

      public interface Runnable{
          public abstract void run();
      }
      
    • 对于函数式接口,我们可以通过lambda表达式来创建该接口的对象。

  • Lambda表达式的推导演示

    现在,我们有一个函数式接口LambdaInterface,它只有一个抽象方法我们该怎样实现他的方法并执行呢?

    • 接口LambdaInterface

      //创建函数式接口
      interface LambdaInterface {
          void lambda();
      }
      
    1. 创建实现类去实现接口,再创建实现类的对象,调用该方法

      //1.创建实现类实现接口
      class LambdaImp implements LambdaInterface {
      
          @Override
          public void lambda() {
              System.out.println("I am Lambda1");
          }
      }
      

      main函数中调用

      public static void main(String[] args) {
          LambdaInterface lambdaImp = new LambdaImp();
          lambdaImp.lambda();
      }
      
    2. 上述需要在外部写一个实现类,比较繁琐,我们简化一下用一个静态内部类实现。

      在TestLambda类中

      //2.静态内部类实现
      static class LambdaImp2 implements LambdaInterface {
          @Override
          public void lambda() {
             System.out.println("I am Lambda2");
          }
      }
      

      main函数中

      LambdaImp2 lambdaImp2 = new LambdaImp2();
      lambdaImp2.lambda();
      
    3. 因为静态内部类的实现不能直接在main函数中写,我们可以继续简化,在main函数中写一个局部内部类实现接口

      //3.局部内部类实现
      class LambdaImp3 implements LambdaInterface {
          @Override
          public void lambda() {
              System.out.println("I am Lambda3");
          }
      }        
      LambdaImp3 lambdaImp3 = new LambdaImp3();     
      lambdaImp3.lambda();
      
    4. 因为是使用局部内部类实现需要写方法名和继承的接口,所以我们继续简化,使用匿名内部类来实现接口

      //4.匿名内部类实现
       lambdaImp = new LambdaInterface() {
          @Override
          public void lambda() {
              System.out.println("I am Lambda4");
          }
      };
      lambdaImp.lambda();
      
    5. 倘若我们要继续简化下去,把一些接口、类和方法的声明都省略掉,仅保留核心代码。此时可以使用Lambda表达式来进行简化!

      //6.Lambda表达式简化实现
      lambdaImp = ()->{
          System.out.println("I am Lambda5");
      };
      lambdaImp.lambda();
      

      运行结果:

      image01

      ​ 我们可以发现,步骤1到步骤5都能实现需求。而每一个步骤都可以做出一定的简化,从步骤1的外部类实现到使用Lambda表达式保留核心代码,使我们的代码更为的简洁了,这便是Lambda表达式的推导过程。

  • Lambda的简化

    创建接口LambdaInterface02

    //1.创建函数式接口
    interface LambdaInterface02 {
        void lambda(int a);
    }
    

    创建测试类TestLambda02

    package com.lambda;
    
    public class TestLambda02 {
        public static void main(String[] args) {
            LambdaInterface02 lambdaInterface = null;
            //Lambda表达式
            LambdaInterface02 lambda1 = (int a) -> {
                System.out.println("I am Lambda"+a);
            };
            lambda1.lambda(1);
            //简化1:去掉括号与类型
            LambdaInterface02 lambda2 = a -> {
                System.out.println("I am Lambda"+a);
            };
            lambda1.lambda(2);
            //简化2:去掉花括号
            LambdaInterface02 lambda3 = (int a) -> System.out.println("I am Lambda"+a);
            lambda1.lambda(3);
    
        }
    }
    

    image02

  • 总结

    1. Lambda表达式只能有一行代码的情况下才能简化成为一行(去掉花括号),如果有多行代码,就需要用代码块包裹(花括号)

    2. 使用Lambda表达式的前提是接口为函数式接口

    3. 多个参数也可以去掉参数类型,但是需要把全部参数类型都去掉且必须加上小括号

      LambdaInterface02 lambda2 = (a,b) -> {
         System.out.println("I am Lambda"+a+b);
      };
      
Built with Hugo
Theme Stack designed by Jimmy