Lambda 表达式 —— Java 8 的函数式编程利器
同学们好今天我们学习 Java 中一个非常重要的特性 ——Lambda 表达式。它让 Java 代码变得更简洁、更灵活是学习 Stream API、函数式编程的基础。一、为什么要引入 Lambda先看一个例子我们想创建一个新线程在控制台打印“Hello”。传统写法匿名内部类Runnable接口只有一个抽象方法run()我们却不得不写一堆“模板代码”。Lambda 表达式就是为了简化这种“只有一个抽象方法的接口”的实现方式。二、Lambda 表达式的语法(参数列表) - { 方法体 }参数列表与方法参数类似类型可省略编译器自动推断。箭头-分隔参数和方法体。方法体如果只有一条语句可省略{}和return如果表达式本身就是返回值。使用lambda表达式创建对象接口只有一个抽象方法:要对接口进行约束防止其他程序员添加抽象类方法在类上加一个注解FunctionlInterfaceFunctionlInterface 函数式接口的标识符 被函数式接口标识的接口表示只能用一个抽象类方法但是可以有default 和static的接口几种常见形式没有返回值有一个参数没有返回值有多个参数形参名字可以不一样有返回值没有参数有返回值有一个参数有返回值有两个参数引用普通方法引用静态方法使用lambda表达式进行遍历三、函数式接口Lambda 表达式只能用在函数式接口上。什么是函数式接口只有一个抽象方法的接口可以有默认方法、静态方法。Java 8 为常见的函数式接口增加了FunctionalInterface注解可选但建议加上编译器会检查。常用的内置函数式接口java.util.function包举例四、实战场景1. 集合排序2. 遍历集合结合 forEach3. 事件监听Swing/JavaFX4. 线程池 / 多线程五、变量捕获闭包Lambda 表达式可以访问外部的有效 final变量即变量值不改变或者实际没有改变。这与匿名内部类类似。从 Java 8 开始变量不一定要显式声明final但必须实际不可变effectively final。不能修改局部变量的值因为它是值拷贝到栈帧中。可以修改实例变量堆中或静态变量。六、方法引用 —— Lambda 的简化糖当 Lambda 体仅仅是调用一个已存在的方法时可以用方法引用进一步简化。语法类名/对象 :: 方法名举例七、注意事项与常见错误Lambda 必须依赖函数式接口。不能单独写一个 Lambda必须赋值给接口变量或用在需要接口的地方。Lambda 体内的return如果方法体是{...}并且有返回值必须写return如果是单表达式返回值自动推断。局部变量不能修改但可以访问。this 关键字Lambda 中的this指向外部类对象而不是 Lambda 本身与匿名内部类不同。匿名内部类中的this指向内部类实例。性能Lambda 不是语法糖完全等价于匿名内部类。JVM 使用invokedynamic动态生成实现类通常性能更优首次调用稍慢后续重用。八、总结Lambda 表达式就是用(参数) - 表达式这种写法替代啰嗦的匿名内部类让你能把一段行为代码块像数据一样传递从而写出更简洁、更灵活、可读性更高的代码。