lambda 三步走:
1.定义函数(一个接口对象)
2. 通过模拟'执行处理代码(如a + b)'获得该函数对象,(建壳)
3.获取该函数对象就可以调用该函数内部的方法并赋予该表达式实际的值。(往壳里填充的值)
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
(parameters) -> expression 或 (parameters) ->{ statements; }
特征:
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
public class Java8Test {
//lamda 定义函数(一个接口对象)》通过模拟'执行处理代码(如a + b)'获得该函数对象 》获取该函数对象就可以调用该函数内部的方法并赋予该表达式实际的值。
private int operate(int a, int b, MathOperation mathOperation){
return mathOperation.operation(a, b);
}
interface MathOperation {
int operation(int a, int b);
}
interface GreetingService {
void sayMessage(String message);
}
public static void main(String[] args) {
Java8Test java8Test = new Java8Test();
//类型声明
MathOperation addition = (int a, int b) -> a + b;
//不用类型声明
MathOperation substract = (a , b) -> a - b;
//大括号中的返回语句(大括号需要有return关键字)
MathOperation multiplication = (int a, int b) -> { return a * b;};
//没有大括号及返回语句
MathOperation division = (int a, int b) -> a / b;
System.out.println("10 + 5 = " + java8Test.operate(10, 5, addition));
System.out.println("10 - 5 = " + java8Test.operate(10, 5, substract));
System.out.println("10 x 5 = " + java8Test.operate(10, 5, multiplication));
System.out.println("10 / 5 = " + java8Test.operate(10, 5, division));
//不用括号
GreetingService greetingService = message -> System.out.println("Hello" + message);
//用括号
GreetingService greetingService1 = (String message) -> {System.out.println("Hello" + message);};
greetingService1.sayMessage("Ruboob");
}
}
变量作用域:lambda 表达式只能引用标记了 final 的外层局部变量
lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
public class Java8Tester {
final static String salutation = "Hello! ";
public static void main(String args[]){
GreetingService greetService1 = message ->
System.out.println(salutation + message);
greetService1.sayMessage("Runoob");
}
interface GreetingService {
void sayMessage(String message);
}
}