Lambda表达式

Lambda

  1. 冗余Runnable代码—Lambda优化

    • RunnableImpl类

      package cn.xiaoge.day17.demo15;
      
      /*
          创建Runnable接口的实现类, 重写run方法, 设置线程任务
       */
      
      public class RunnableImpl implements Runnable {
      
          @Override
          public void run() {
              System.out.println(Thread.currentThread().getName() + "新的线程创建");
          }
      
      }
      
      
    • 执行路口

      package cn.xiaoge.day17.demo15;
      
      /*
          使用实现Runnable接口的方式实现多线程程序
       */
      
      public class Demo01Runnable {
      
          public static void main(String[] args) {
              // 创建Runnable接口的实现类对象
              RunnableImpl run = new RunnableImpl();
              // 创建Thread类对象, 构造方法中传递Runnable接口的实现类
              Thread t = new Thread(run);
              // 调用start方法开启新线程, 执行run方法
              t.start();
      
              // 简化代码, 使用匿名内部类, 实现多线程程序
              new Thread(new Runnable() {
                  @Override
                  public void run() {
                      System.out.println(Thread.currentThread().getName() + "新的线程创建");
                  }
              }).start();
          }
      
      }
      
      // 运行结果
      Thread-0新的线程创建
      Thread-1新的线程创建
      
    • 执行路口

      package cn.xiaoge.day17.demo15;
      
      /*
          Thread implements Runnable
      
          Lambda表达式的标准格式:
              有三部分组成:
                  a. 一些参数
                  b. 一个箭头
                  c. 一段代码
              格式:
                  (参数列表) -> {一些重写方法的代码};
              解释说明格式:
                  (): 接口中抽象方法的参数列表, 没有参数, 就空着; 有参数就写出参数, 多个参数用逗号分隔
                  ->: 传递的意思, 把参数传递给方法体{}
                  {}: 重写接口的抽象方法的方法体
       */
      
      public class Demo02Lambda {
      
          public static void main(String[] args) {
              // 使用匿名内部类, 实现多线程程序
              new Thread(new Runnable() {
                  @Override
                  public void run() {
                      System.out.println(Thread.currentThread().getName() + "新的线程创建");
                  }
              }).start();
      
              // 使用Lambda表达式, 实现多线程
              new Thread( () -> {
                  System.out.println(Thread.currentThread().getName() + "新的线程创建");
              }).start();
      
              // 优化省略Lambda
              new Thread( () -> System.out.println(Thread.currentThread().getName() + "新的线程创建")).start();
          }
      
      }
      
      // 运行结果
      Thread-0新的线程创建
      Thread-1新的线程创建
      Thread-2新的线程创建
      
  2. Lambda无参无返回值的

    • Cook接口

      package cn.xiaoge.day17.demo16;
      
      public interface Cook {
      
          public abstract void makeFood();
      
      }
      
      
    • 执行路口

      package cn.xiaoge.day17.demo16;
      
      /*
          需求:
              给定一个厨子Cook接口, 内容唯一的抽象方法makeFood, 且无参数, 无返回值.
              使用Lambda的标准格式调用invokeCook方法, 答应输出"吃饭啦! "字样
       */
      
      public class Demo01Cook {
      
          public static void main(String[] args) {
              // 调用invokeCook方法, 参数是Cook接口, 传递Cook接口的匿名内部内
              invokeCook(new Cook() {
                  @Override
                  public void makeFood() {
                      System.out.println("吃饭啦! ");
                  }
              });
      
              // 使用Lambda表达式, 简化匿名内部类的书写
              invokeCook(() -> {
                  System.out.println("吃饭啦! ");
              });
      
              // 优化Lambda
              invokeCook(() -> System.out.println("吃饭啦! "));
          }
      
          // 定义一个方法, 参数传递Cook接口, 方法内部调用Cook接口中的方法makeFood
          public static void invokeCook(Cook cook) {
              cook.makeFood();
          }
      
      }
      
      // 运行结果
      吃饭啦! 
      吃饭啦! 
      吃饭啦! 
      
  3. Lambda表达式有参数的返回值的练习

    • Person类

      package cn.xiaoge.day17.demo17;
      
      public class Person {
      
          private String name;
          private int age;
      
          public Person() {
          }
      
          public Person(String name, int age) {
              this.name = name;
              this.age = age;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      
          @Override
          public String toString() {
              return "Person{" +
                      "name='" + name + '\'' +
                      ", age=" + age +
                      '}';
          }
      }
      
      
    • 执行路口

      package cn.xiaoge.day17.demo17;
      
      /*
          Lambda表达式有参数的返回值的练习
          需求:
              使用数组存储多个Person对象
              对数组中的Person对象使用Arrays的sort方法通过年龄进行升序排序
       */
      
      import java.util.Arrays;
      import java.util.Comparator;
      
      public class Demo01Arrays {
      
          public static void main(String[] args) {
              Person[] person = {
                      new Person("柳岩", 38),
                      new Person("迪丽热巴", 18),
                      new Person("古力娜扎", 19),
              };
      
              // 对数组中的Person对象使用Arrays的sort方法通过年龄进行升序(前边-后边)排序
              /*Arrays.sort(person, new Comparator<Person>() {
                  @Override
                  public int compare(Person o1, Person o2) {
                      return o1.getAge()-o2.getAge();
                  }
              });
              System.out.println(Arrays.toString(person)); // [Person{name='迪丽热巴', age=18}, Person{name='古力娜扎', age=19}, Person{name='柳岩', age=38}]
              */
      
              // 使用Lambda表达式, 简化匿名内部类
              Arrays.sort(person, (Person p1, Person p2)->{
                  return p1.getAge() - p2.getAge();
              });
              System.out.println(Arrays.toString(person)); // [Person{name='迪丽热巴', age=18}, Person{name='古力娜扎', age=19}, Person{name='柳岩', age=38}]
      
              // 优化Lambda
              Arrays.sort(person, (p1, p2)-> p1.getAge() - p2.getAge());
          }
      
      }
      
      // 运行结果
      [Person{name='迪丽热巴', age=18}, Person{name='古力娜扎', age=19}, Person{name='柳岩', age=38}]
      
  4. Lambda表达式有参数有返回值的练习

    • Calculator接口

      package cn.xiaoge.day17.demo18;
      
      /*
          定义一个计算器Calculator接口, 内含抽象方法calc可以将两个int数字相加得到和值
       */
      
      public interface Calculator {
          // 定义一个计算两个int整数和的方法并返回结果
          public abstract int calc(int a, int b);
      
      }
      
      
    • 执行路口

      package cn.xiaoge.day17.demo18;
      
      /*
          Lambda表达式有参数有返回值的练习
          需求:
              给定一个计算器Calculator接口, 内含抽象方法calc可以将两个int数字相加得到和值
              使用Lambda的标准格式调用invokeCalc方法, 完成120和130相加计算
       */
      
      public class Demo01Calculator {
      
          public static void main(String[] args) {
              // 调用invokeCalc方法, 方法的参数是一个接口, 可以使用匿名内部类
              /*invokeCalc(10, 20, new Calculator() {
                  @Override
                  public int calc(int a, int b) {
                      return a + b;
                  }
              });*/
      
              // 使用Lambda表达式简化匿名内部类的写法
              invokeCalc(120, 130, (int a, int b)->{
                  return a + b;
              });
      
              // 优化Lambda
              invokeCalc(120, 130, (a, b)-> a + b);
          }
      
          /*
              定义一个方法
              参数传递两个int类型的整数
              参数传递Calculator接口
              方法内部调用Calculator中的方法calc计算两个整数的和
          */
          public static void invokeCalc(int a, int b, Calculator c) {
              int sum = c.calc(a, b);
              System.out.println(sum);
          }
      
      }
      
      // 运行结果
      250
      250
      
  5. Lambda使用前提

    • 执行路口

      package cn.xiaoge.day17.demo19;
      
      /*
          Lambda表达式: 是可推导, 可以省略
          凡是根据上下文推导出来的内容, 都可以省略不写
          可以省略的内容:
              1. (参数列表): 括号中参数列表的数据类型, 可以省略不写
              2. (参数列表): 括号中的参数如果只有一个, 那么类型和()都可以省略
              3. (一些代码): 如果()中的代码只有一行, 无论是否包含返回值, 都可以省略({}, return, 分号)
                  注意: 要省略{}, return, 分号必须一起省略
       */
      
      /*
          Lambda使用前提:
          Lambda的语法非常简洁,完全没有面向对象复杂的束缚。但是使用时有几个问题需要特别注意:
          1. 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。
              无论是JDK内置的 Runnable 、 Comparator 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一 时,才可以使用Lambda。
          2. 使用Lambda必须具有上下文推断。
              也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
          备注:有且仅有一个抽象方法的接口,称为“函数式接口”。
       */
      
      import java.util.ArrayList;
      
      public class Demo01ArrayList {
      
          public static void main(String[] args) {
              // JDK1.7版本之前, 创建集合对象必须把前后的泛型写上
              ArrayList<String> list01 = new ArrayList<String>();
      
              // JDK1.7版本之后, =号后边的泛型可以省略, 后边的泛型可以根据前边的泛型推到出来
              ArrayList<String> list02 = new ArrayList<>();
          }
      
      }
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只因为你温柔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值