前言
最近学习集合的时候了解到lambda表达式,javaScript-ES6中也使用了箭头函数,有时候也叫lambda 表达式,在js中用(=>)来定义简单的函数,在java中用(—>)符号来表示;不过大家都知道,java和javaScript的关系就像是雷锋和雷峰塔的关系 ,咱们还是来说java中的lambda表达式。
正文
一、什么是Lambda 表达式?
lambda 表达式实际上是一个匿名方法。咱们还是举个例子来说明下:
在没有用lambda表达式之前的方法:
public int add(int x,int y){
return x + y;
}
用了lambda表达式之后的方法:
//写法一
(int x,int y) -> x + y;
//写法二
(x,y) -> x + y;
//写法三
(x,y) ->{ return x + y;}
//其它写法
二、lambda表达式的语法
根据上面的写法,可以推测到lambda表达式的组成:
参数列表,箭头(-> ),方法体(一个表达式或语句块)
(parameters) -> expression
或
(parameters) -> {statements;}
说明:
- 可选类型声明:不声明参数类型也可以,编译器可以统一识别参数值
- 可选的参数圆括号:一个参数可以不定义圆括号,但是多个参数需要定义圆括号
- 可选的大括号:如果主体包含了一个语句,可以不使用大括号
- 可选的返回(return)关键字:如果主体只有一个表达式返回值则编译器会自动返回值,如果使用了return 关键字,则需要加上大括号。
public class Java8Tester {
public static void main(String args[]){
Java8Tester tester = new Java8Tester();
// 类型声明
MathOperation addition = (int a, int b) -> a + b;
// 不用类型声明
MathOperation subtraction = (a, b) -> a - b;
// 有大括号,有return 关键字
MathOperation multiplication = (int a, int b) -> { return a * b; };
// 没有大括号没有return 关键字
MathOperation division = (int a, int b) -> a / b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
System.out.println("10 / 5 = " + tester.operate(10, 5, division));
// 参数不用括号
GreetingService greetService1 = message ->
System.out.println("Hello " + message);
// 参数用括号
GreetingService greetService2 = (message) ->
System.out.println("Hello " + message);
greetService1.sayMessage("Runoob");
greetService2.sayMessage("Google");
}
interface MathOperation {
int operation(int a, int b);
}
interface GreetingService {
void sayMessage(String message);
}
private int operate(int a, int b, MathOperation mathOperation){
return mathOperation.operation(a, b);
}
}
三、函数式接口
函数式接口就是显示声明一个接口,这个接口中有且只有一个抽象方法,为了保证抽象方法的数量,java8提供了一个专用注解@FunctionInterface,当接口中声明的方法不为1个时就会报错。
@FunctionalInterface
public interface Test{
void f1();
}
四、lambda表达式与函数式接口的关系
对于普通类型的接口,我们想要使用需要定义一个类来实现其中的方法,而函数式接口除了使用普通的方法来实现之外,还支持用lambda表达式来实现。lambda表达式可以理解为是对函数式接口和其中抽象方法的具体实现。 当有一个方法需要函数式接口作为参数时,我们就可以传递一个对应的lambda表达式作为参数,执行的时候就会自动执行函数式接口中的唯一方法。
举例说明
五、java8 四大核心函数式接口
未完待续。。