Loading... > Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。 > JDK1.8之后。函数式编程。 # 1、标准格式 `(参数列表) -> { 代码 }` # 2、省略规则 1. 小括号内的参数类型可以省略; 2. 仅有一个参数,可以省略小括号; 3. 大括号中仅有一行代码,无论是否有返回值, `{}` 、 `return` 、以及 `;` 都可以省略(三者必须一起省略)。 # 3、使用前提 1. 必须具有接口,且要求接口中有且仅有一个抽象方法。 无论是JDK内置的 `Runnable`、 `Comparator` 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一 时,才可以使用Lambda。 2. 使用Lambda必须具有上下文推断。 也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。 【备注】有且仅有一个抽象方法的接口,称为“函数式接口”。 * 示例一:无参、无返回 ```java has-numbering public interface Cook { void makeFood(); } ``` ```java has-numbering public class Cooker { public static void main(String[] args) { cooker(() -> System.out.println("干饭人!干饭了!!!")); } private static void cooker(Cook cook) { cook.makeFood(); } } ``` * 示例二:有参、有返回 ```java has-numbering public interface Calculator { int calc(int a, int b); } ``` ```java has-numbering public class TestCalculator { public static void main(String[] args) { invokeCalc(2, 3, (a, b) -> a + b); } private static void invokeCalc(int a, int b, Calculator calculator) { int result = calculator.calc(a, b); System.out.println(result); } } ``` # 4、方法引用 双冒号 `::` 为引用运算符,而它所在的表达式被称为方法引用。如果Lambda要表达的函数方案已经存在于某个方法的实现中,那么则可以通过双冒号来引用该方法作为Lambda的替代者。 【注意】Lambda 中传递的参数一定是方法引用中的那个方法可以接收的类型,否则会抛出异常。 * 通过对象名引用成员方法 已经存在某个对象obj时, `obj::method` * 通过类名引用静态方法 静态方法使用类名进行引用, `Math::abs` * 通过super引用父类成员方法 如果存在继承关系,当Lambda中需要出现super调用时,也可以使用方法引用进行替代, `super::method` * 通过this引用本类成员方法 本类的成员方法使用this引用, `this::method` * 通过类的构造器(构造方法)引用 `类名::new` * 数组的构造器(构造方法)引用 `int[]::new` > 感谢小伙伴们的关注! > 你的点赞、评论、关注、收藏是对博主的最大鼓励! > 持续更新JavaSE学习笔记!欢迎订阅专栏! 最后修改:2021 年 10 月 06 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏