Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。 JDK1.8之后。函数式编程。
1、标准格式
(参数列表) -> { 代码 }
2、省略规则
- 小括号内的参数类型可以省略;
- 仅有一个参数,可以省略小括号;
- 大括号中仅有一行代码,无论是否有返回值,
{} 、 return 、以及 ; 都可以省略(三者必须一起省略)。
3、使用前提
- 必须具有接口,且要求接口中有且仅有一个抽象方法。
无论是JDK内置的 Runnable 、 Comparator 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一 时,才可以使用Lambda。
- 使用Lambda必须具有上下文推断。
也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。 【备注】有且仅有一个抽象方法的接口,称为“函数式接口”。
public interface Cook {
void makeFood();
}
public class Cooker {
public static void main(String[] args) {
cooker(() -> System.out.println("干饭人!干饭了!!!"));
}
private static void cooker(Cook cook) {
cook.makeFood();
}
}
public interface Calculator {
int calc(int a, int b);
}
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
如果存在继承关系,当Lambda中需要出现super调用时,也可以使用方法引用进行替代, super::method
本类的成员方法使用this引用, this::method
类名::new
int[]::new
感谢小伙伴们的关注! 你的点赞、评论、关注、收藏是对博主的最大鼓励! 持续更新JavaSE学习笔记!欢迎订阅专栏!
相关内容 👉 JavaSE详细笔记专栏
往期精彩内容 👉 Java中的流程控制【干货笔记】 👉 Java中的数组【干货笔记】 👉 Java类与对象【干货笔记】 👉 Java笔试题专栏
|