Lambda表达式会让代码更加简洁,它本质上就是一个匿名函数,可以代替匿名内部类来实现接口,是基于数学中的λ演算得名,也可称为闭包(Closure)。当开发者在编写Lambda表达式时,会随之被编译成一个函数式接口。
| 定义 | 一个接口有且只有一个抽象方法 |
| 注意 | 1、如果只有一个接口只有一个抽象方法,那么该接口就是一个函数式接口 |
| 2、如果我们在某个接口上声明了@FunctionalInterface注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果有两个抽象方法,程序就会报错。 | |
| 3、从某种意义上来说,只要你保证你的接口 中只有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的 |
| 描述 | Lambda表达式函数,只有参数列表和方法体; |
| ( 参数列表 ) → { 方法体 } 举例:( int a ) → { System.out.println(a); } | |
| () | 用来表示参数列表; |
| 参数列表 | 类似方法中的形参列表,这里的参数是函数式接口里的参数; |
| {} | 用来描述方法体; |
| 方法体 | 可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不返回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不返回 |
| → | Lambda运算符,可以叫做箭头符号,或者goes to |
- public class LambdaMain {
- public static void main(String[] args) {
- // 举例 1 :无参数 无返回值 接口方法
- LambdaNoParameters noParameters = () -> {
- System.out.println("无参数 无返回值 接口方法");
- } ;
- noParameters.methodNoParameters();
-
-
- // 举例 2 :单个参数 无返回值 接口方法
- LambdaSingleParameter singleParameter = (int param) -> {
- System.out.println("单个参数:"+param+" 无返回值 接口方法");
- } ;
- singleParameter.methodSingleParameter(22);
-
- // 举例 3 :多个参数 无返回值 接口方法
- LambdaMultipleParameters multipleParameters = (int param1,String param2) -> {
- System.out.println("多个参数:"+param1+param2+" 无返回值 接口方法");
- };
- multipleParameters.methodMultipleParameters(22,"33");
-
- // 举例 3 :多个参数 有返回值 接口方法
- LambdaExistenceReturn existenceReturn = (int param1,String param2) -> {
- return "参数返回:"+param1+param2;
- };
- System.out.println(existenceReturn.methodExistenceReturn(22, "44"));
-
- }
- }
-
- interface LambdaNoParameters{
- //无参数 无返回值 接口方法
- void methodNoParameters();
- }
-
- interface LambdaSingleParameter{
- //单个参数 无返回值 接口方法
- void methodSingleParameter(int param);
- }
-
- interface LambdaMultipleParameters{
- //有参数 无返回值 接口方法
- void methodMultipleParameters(int param1,String param2);
- }
-
- interface LambdaExistenceReturn{
- //有参数 有返回值 接口方法
- String methodExistenceReturn(int param1,String param2);
- }

| 1、参数类型可以省略 |
| 2、假如只有一个参数,()括号可以省略 |
| 3、如果方法体只有一条语句,{}大括号可以省略 |
| 4、如果方法体中唯一的语句是return返回语句,那省略大括号的同时return也要省略 |
- public class LambdaMain {
- public static void main(String[] args) {
- // 举例 1 :无参数 无返回值 接口方法
- LambdaNoParameters noParameters = () -> {
- System.out.println("无参数 无返回值 接口方法");
- } ;
- //精简
- noParameters = () -> System.out.println("无参数 无返回值 接口方法");
- noParameters.methodNoParameters();
-
- // 举例 2 :单个参数 无返回值 接口方法
- LambdaSingleParameter singleParameter = (int param) -> {
- System.out.println("单个参数:"+param+" 无返回值 接口方法");
- } ;
- //精简
- singleParameter = (param)-> System.out.println("单个参数:"+param+" 无返回值 接口方法");
- singleParameter.methodSingleParameter(22);
-
- // 举例 3 :多个参数 无返回值 接口方法
- LambdaMultipleParameters multipleParameters = (int param1,String param2) -> {
- System.out.println("多个参数:"+param1+param2+" 无返回值 接口方法");
- };
- //精简
- multipleParameters = (param1,param2) -> System.out.println("多个参数:"+param1+param2+" 无返回值 接口方法");
- multipleParameters.methodMultipleParameters(22,"33");
-
- // 举例 3 :多个参数 有返回值 接口方法
- LambdaExistenceReturn existenceReturn = (int param1,String param2) -> {
- return "参数返回:"+param1+param2;
- };
- //精简
- existenceReturn = (param1,param2) -> "参数返回:"+param1+param2 ;
- System.out.println(existenceReturn.methodExistenceReturn(22, "44"));
-
- }
- }
-
- interface LambdaNoParameters{
- //无参数 无返回值 接口方法
- void methodNoParameters();
- }
-
- interface LambdaSingleParameter{
- //单个参数 无返回值 接口方法
- void methodSingleParameter(int param);
- }
-
- interface LambdaMultipleParameters{
- //有参数 无返回值 接口方法
- void methodMultipleParameters(int param1,String param2);
- }
-
- interface LambdaExistenceReturn{
- //有参数 有返回值 接口方法
- String methodExistenceReturn(int param1,String param2);
- }
| 方法引用 | 如果存在多个相同的Lambda表达式实现函数,我们可以封装成通用方法,以便于维护 |
| 方法引用语法 | 对象::方法 (如果是静态方法,可以直接:类名::方法) |
- import java.math.BigDecimal;
-
- public class LambdaMain {
- public static void main(String[] args) {
-
- BigDecimal sum = BigDecimal.ZERO;
- BigDecimal abc = new BigDecimal("666");
-
- LambdaMain lambdaMain = new LambdaMain();
- LambdaSumParameters sumParameters = null;
-
- // 数据捕获 abc
- sumParameters = (abcd, efgh)->abc.add(efgh);
- sum = sumParameters.methodNoParameters(new BigDecimal("444.444"), BigDecimal.TEN);
- System.out.println(sum); // 666 + 10
-
- // 调用实例方法
- sumParameters = lambdaMain::sum ;
- sum = sumParameters.methodNoParameters(new BigDecimal("333.333"), BigDecimal.TEN);
- System.out.println(sum);
-
- // 通过类名调用静态实例方法
- sumParameters = LambdaMain::staticSum;
- sum = sumParameters.methodNoParameters(new BigDecimal("444.444"), BigDecimal.TEN);
- System.out.println(sum);
-
- // 通过类名调用静态实例方法
- sumParameters = BigDecimal::add;
- sum = sumParameters.methodNoParameters(new BigDecimal("444.444"), BigDecimal.TEN);
- System.out.println(sum);
-
-
- }
-
- //定义通用求和函数
- BigDecimal sum(BigDecimal param1,BigDecimal param2){
- return param1.add(param2);
- }
- //定义静态通用求和函数
- static BigDecimal staticSum(BigDecimal param1,BigDecimal param2){
- return param1.add(param2);
- }
- }
-
- interface LambdaSumParameters{
- //无参数 无返回值 接口方法
- BigDecimal methodNoParameters(BigDecimal a,BigDecimal b);
- }
