Java Lambda 表达式详解
引入
Lambda 表达式是 Java SE 8 中一个重要的新特性。Lambda 表达式允许你通过表达式来代替功能接口。Lambda 表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。Lambda 表达式可以看作是一个匿名函数。
语法
基本语法:(parameters) -> expression 或 (parameters) -> { statements; }
Lambda 表达式由三部分组成:
- parameters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由 JVM 隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。
- ->:可理解为'被用于'的意思;
- 方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不返回,这里的代码块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不返回。
函数式接口
要了解 Lambda 表达式,首先需要了解什么是函数式接口。
函数式接口定义:一个接口有且只有一个抽象方法。
注意:
- 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口。
- 如果我们在某个接口上声明了@FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口中只有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的。
@FunctionalInterface interface NoParameterNoReturn { void test(); }
@FunctionalInterface interface NoParameterNoReturn { void test(); default void test2(){ System.out.println("JDK 1.8 新特性,default 默认方法可以有具体的实现"); } }
Lambda 表达式的使用
Lambda 表达式本质是一个匿名函数,函数的方法是:返回值 方法名 参数列表 方法体。在 Lambda 表达式中我们只需要关心:参数列表 方法体。
语法精简
- 参数类型可以省略,如果需要省略,每个参数的类型都要省略。
- 参数的小括号里面只有一个参数,那么小括号可以省略。
- 如果方法体当中只有一句代码,那么大括号可以省略。
- 如果方法体中只有一条语句,要么是输出语句,其次是 return 语句,那么大括号可以省略,且去掉 return 关键字。
代码示例
//无返回值无参数
@FunctionalInterface interface { ; }
{ ; }
{ ; }
{ ; }
{ ; }
{ ; }
{
{
(x,y) -> System.out.println(x+y);
moreParameterNoReturn.test(,);
}
}


