Lambda 表达式,自从被Java8引入以来,真的堪称是最大最重量级的新特性。 Lambda丰富了功能化编程,简化了程序员的代码书写。
语法
parameter -> expression body
what? Are you kidding me?
这么简单?
是的 就是这么简单!
我们来看看lambda的一些重要特点:
- 可选的类型声明:简单的来说 就是我们在使用lambda表达式的时候,不再需要首先定性变量或者参数的类型,因为编译器可以runtime的环境中自动帮你推断出变量的类型,卧槽 是不是碉堡了
- 可选的参数括号: 如果你的参数只有一个的话,那么你阔以直接省略掉这个括号。但是多个参数的话,括号还是需要的。
- 可选的方法大括号: 如果你的语句只有一句的话,那么你可以连方法的大括号都不用写。所以就变成了上面的那种形式。
- 可选的返回值关键词:简单来说如果你方法体只有一句话并且带有返回值,那么你可以不用再写return了, 连return都给你省略了,因为编译器会帮你自动的返回这个值
说了这么多,那我们来看看具体的用法吧,光说不练假把式, 代码见
public class Java8Tester {
public static void main(String args[]){
Java8Tester tester = new Java8Tester();
//with type declaration
MathOperation addition = (int a, int b) -> a + b;
//with out type declaration
MathOperation subtraction = (a, b) -> a - b;
//with return statement along with curly braces
MathOperation multiplication = (int a, int b) -> { return a * b; };
//without return statement and without curly braces
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));
//without parenthesis
GreetingService greetService1 = message ->
System.out.println("Hello " + message);
//with parenthesis
GreetingService greetService2 = (message) ->
System.out.println("Hello " + message);
greetService1.sayMessage("Orange");
greetService2.sayMessage("Cat");
}
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);
}
}
验证结果
如果你直接使用IDE的话,直接运行就好,如果你喜欢用命令行的话,
$javac Java8Tester.java
$java Java8Tester
结果:
10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Orange
Hello Cat
Lambda表达式主要还是被用来定义那些只有一个方法的接口,这种情况下,我们可以直接使用Lambda表达式来省略我们的大量方法。它最大的好处就是 消除了繁杂的匿名内部类 的写法,各种大括号,小括号。
我相信有Android开发经验的人应该能了解吧。那种匿名内部类给你带来的恐惧