• Lambda表达式实现方式、标准格式、练习、省略模式、注意事项及和匿名内部类的区别


    目录

    一、Lambda表达式实现方式

    二、Lambda表达式的标准格式

    三、Lambda表达式练习

    四、Lambda表达式的省略模式

    五、Lambda表达式的注意事项

    六、Lambda表达式和匿名内部类的区别


    一、Lambda表达式实现方式

    需求:

    启动一个线程,在控制台输出一句话:多线程程序启动了

    实现方式一:

    实现步骤:

    ● 定义一个类MyRunnable实现Runnable接口,重写run()方法

    ● 创建MyRunnable类的对象

    ● 创建Thread类的对象,把MyRunnable的对象作为构造参数传递

    ● 启动线程

    实现方式二:

    匿名内部类的方式改进

    实现方式三:

    Lambda表达式的方式改进

    代码演示:

    1. //方式一的线程类
    2. public class MyRunnable implements Runnable {
    3. @Override
    4. public void run() {
    5. System.out.println("多线程程序启动了");
    6. }
    7. }
    8. public class LambdaDemo {
    9. public static void main(String[] args) {
    10. //方式一
    11. MyRunnable my = new MyRunnable();
    12. Thread t = new Thread(my);
    13. t.start();
    14. //方式二
    15. new Thread(new Runnable() {
    16. @Override
    17. public void run() {
    18. System.out.println("多线程程序启动了");
    19. }
    20. }).start();
    21. //方式三
    22. new Thread( () -> {
    23. System.out.println("多线程程序启动了");
    24. } ).start();
    25. }
    26. }

    函数式编程思想概述:

    函数式思想则尽量忽略面向对象的复杂语法:"强调做什么,而不是以什么形式去做"

    而Lambda表达式就是函数式思想的体现

    二、Lambda表达式的标准格式

    格式:(形式参数) -> (代码块)

    形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可

    ->:由英文中画线和大于符号组成,固定写法。代表指向动作

    代码块:是我们具体要做的事情,也就是以前我们写的方法体内容

    组成Lambda表达式的三要素:

    形式参数,箭头,代码块

    三、Lambda表达式练习

    Lambda表达式的使用前提:

    有一个接口

    接口中有且仅有一个抽象方法

    练习描述:无参无返回值抽象方法的练习

    操作步骤:

    ○ 定义一个接口(Eatable),里面定义一个抽象方法:void eat();

    ○ 定义一个测试类(EatableDemo),在测试类中提供两个方法

            ■ 一个方法是:useEatable(Eatable e)

            ■ 一个方法是主方法,在主方法中调用useEatable方法

    示例代码:

    1. //接口
    2. public interface Eatable {
    3. void eat();
    4. }
    5. //实现类
    6. public class EatableImpl implements Eatable {
    7. @Override
    8. public void eat() {
    9. System.out.println("一天一苹果,医生远离我");
    10. }
    11. }
    12. //测试类
    13. public class EatableDemo {
    14. public static void main(String[] args) {
    15. //在主方法中调用useEatable方法
    16. Eatable e = new EatableImpl();
    17. useEatable(e);
    18. //匿名内部类
    19. useEatable(new Eatable() {
    20. @Override
    21. public void eat() {
    22. System.out.println("一天一苹果,医生远离我");
    23. }
    24. });
    25. //Lambda表达式
    26. useEatable(() -> {
    27. System.out.println("一天一苹果,医生远离我");
    28. });
    29. }
    30. private static void useEatable(Eatable e) {
    31. e.eat();
    32. }
    33. }

    四、Lambda表达式的省略模式

    省略的规则:

    ● 参数类型可以省略,但是有多个参数的情况下,不能只省略一个

    ● 如果参数有且仅有一个,那么小括号可以省略

    ● 如果代码块的语句只有一条,可以省略大括号和分号,和return关键字

    代码演示:

    1. public interface Addable {
    2. int add(int x, int y);
    3. }
    4. public interface Flyable {
    5. void fly(String s);
    6. }
    7. public class LambdaDemo {
    8. public static void main(String[] args) {
    9. useAddable((int x,int y) -> {
    10. return x + y;
    11. });
    12. //参数的类型可以省略
    13. useAddable((x, y) -> {
    14. return x + y;
    15. });
    16. useFlyable((String s) -> {
    17. System.out.println(s);
    18. });
    19. //如果参数有且仅有一个,那么小括号可以省略
    20. useFlyable(s -> {
    21. System.out.println(s);
    22. });
    23. //如果代码块的语句只有一条,可以省略大括号和分号
    24. useFlyable(s -> System.out.println(s));
    25. //如果代码块的语句只有一条,可以省略大括号和分号,如果有return,return也要省略掉
    26. useAddable((x, y) -> x + y);
    27. }
    28. private static void useFlyable(Flyable f) {
    29. f.fly("风和日丽,晴空万里");
    30. }
    31. private static void useAddable(Addable a) {
    32. int sum = a.add(10, 20);
    33. System.out.println(sum);
    34. }
    35. }

    五、Lambda表达式的注意事项

    使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法

    必须由上下文环境,才能推导出Lambda对应的接口

    根据局部变量的赋值得知Lambda对应的接口

    Runnable = () -> System.out.println("Lambda表达式");

    根据调用方法的参数得知Lambda对应的接口

    new Thread(() -> System.out.println("Lambda表达式")).start();

    六、Lambda表达式和匿名内部类的区别

    所需类型不同

    匿名内部类:可以是接口,也可以是抽象类,还可以是具体类

    Lambda表达式:只能是接口

    使用限制不同:

    如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类

    如果接口中多了一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式

    实现原理不同:

    匿名内部:编译之后,产生一个单独的.class字节码文件

    Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成

  • 相关阅读:
    Web上的推箱子游戏Sokoban
    点阵 LED 显示设计实验
    【Apache Spark 】第 5 章Spark SQL 和 DataFrames:与外部数据源交互
    vue3 vue-router4 No match found for location with path “/home“
    图信号处理论文
    SpringCloud入门详细教程二(Nacos配置管理,http客户端Feign,统一网关Gateway)
    单元测试编写规范
    String 地址引用问题
    力扣周赛304 6135. 图中的最长环 内向基环树
    BeanDefinition
  • 原文地址:https://blog.csdn.net/m0_61961937/article/details/126883525