Java基础之Lambda

82 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

1.1 函数式编程思想概括

  • 在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿数据做操作”
  • 面向对象思想强调“必须通过对象的形式来做事情”
  • 函数式思想则尽量忽略面向对象的复杂语法:“强调做什么, 而不是以什么形式去做”
  • 而我们要学习的L ambda表达式就是函数式思想的体现

1.2 Lambda表达式标准格式

在这里插入图片描述

  • 组成Lambda表达式的三要素:形式参数,箭头,代码块
  • Lambda表达式的格式
    • 格式:(形式参数) -> {代码块}
    • 形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
    • ->:由英文中画线和大于符号组成,固定写法。代表指向动作
    • 代码块: 是我们具体要做的事情,也就是以前我们写的方法体内容

1.3 Lambda表达式注意事项

  • 使用Lambda必须要有接口, 并且要求接口中有且仅有一个抽象方法
  • 必须有上下文环境,才能推导出Lambda对应的接口
    • 根据 局部变量的赋值 得知ambda对应的接口: Runnable r= () -> System.out.printn("Lambda表达式");
    • 根据 调用方法的参数 得知Lambda对应的接口: new Thread( -> System.out.printn("Lambda表达式).start();
  • 范例
package test;

public class InterDemo {
    public static void main(String[] args) {
//        useInter(()->{
//            System.out.println("好好学习"); //好好学习
//        });

        //使用Lambda表达式必须要有接口,接口中只能有一个抽象方法
        useInter(()-> System.out.println("好好学习"));

        //必须有上下文环境,才能推导出Lambda对应的接口
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("匿名内部类");
//            }
//        }).start();

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

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

    private static void useInter(Inter i) {
        i.show();
    }
}

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

  • 所需类型不同
    • 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
    • Lambda表达式:只能是接口
  • 使用限制不同
    • 如果接口中有且仅有一个抽象方法, 可以使用Lambda表达式,也可以使用匿名内部类
    • 如果接口中多个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
  • 实现原理不同
    • 匿名内部类:编译之后,产生一个单独的.class字节码文件(占空间)
    • Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成