#下面为什么能够把lambda表达式赋值给接口类型的变量,难道是隐藏了什么让解释器来做?
public class JavaLambdaTester {
public static void main(String args[]){
JavaLambdaTester tester = new Java8Tester();
/*用lambda表达式来表达接口方法的各种实现,实际上省略了new 接口实现类名{},看起来是将接口方法的实现
赋值给了接口类型的对象,这实际上是匿名类的一种表达*/
//形参可进行类型声明
MathOperation addition = (int a, int b) -> a + b;
// 形参也可不进行类型声明
MathOperation subtraction = (a, b) -> a - b;
//返回语句放在大括号
MathOperation multiplication = (int a, int b) -> { return a * b; };
// 没有大括号及返回语句,解释器会自动将表达式结果给调用者
MathOperation division = (int a, int b) -> a / b;
/*使用接口类型的对象直接代表lambda表达式所表示的函数,将它作为另一个函数的实参;
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));
//将实现接口方法的lambda表达式赋值给接口对象
// 形参不用声明类型,解释器会同一认定,单个形参可以不用括号
GreetingService greetService1 = message ->
System.out.println("Hello " + message);
//单个形参用括号
GreetingService greetService2 = (message) ->
System.out.println("Hello " + message);
//用接口类型的对象调用被实现的接口方法,方法的实现由lambda来表达,实际上是在执行lambda表达式;
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);
}
}