Lambda表达式是Java8的重要更新。Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。
首先,我们先使用匿名内部类来写一个例子,然后对比Lambda表达式。
先写一个接口:
public interface Command {
//接口里定义的process方法用于封装“处理行为”
void process(int[] target);
}
匿名内部类:
public class CommandTest {
public static void main(String[] args){
ProcessArray pa = new ProcessArray();
int[] target = {3,-4,6,4};
//处理数组,具体处理行为取决于匿名内部类
pa.process(target, new Command(){
@Override
public void process(int[] target) {
// TODO 自动生成的方法存根
int sum = 0;
for(int tmp : target){
sum += tmp;
}
System.out.println("数组元素的总和是:" + sum);
}
});
}
}
Lambda表达式:
public class CommandTest2 {
public static void main(String[] args){
ProcessArray pa = new ProcessArray();
int[] array = {3,-4,6,4};
pa.process(array, (int[] target)->{
int sum = 0;
for(int tmp : target){
sum += tmp;
}
System.out.println("数组元素的总和:" + sum);
});
}
}
由上面可以看出,Lambda表达式简化创建匿名内部类对象。
Lambda表达式的主要作用就是代替匿名内部类的繁琐语法。它由三部分组成。
——形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
——箭头(->)。必须通过英文中画线和大于符号组成。
——代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么这条语句就不要用花括号表示语句结束。Lambda代码块中只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。
Lambda表达式的几种简化写法:
interface Eatable{
void taste();
}
interface Flyable{
void fly(String weather);
}
interface Addable{
int add(int a, int b);
}
public class LambdaQs {
//调用该方法需要Eatable对象
public void eat(Eatable e){
System.out.println("我在吃苹果");
e.taste();
}
//调用该方法需要Flyable对象
public void drive(Flyable f){
System.out.println("我正在驾驶:" + f);
f.fly("【碧空如洗的晴空】");
}
//调用该方法需要Addable对象
public void test(Addable add){
System.out.println("5与3的和为:" + add.add(5, 3));
}
public static void main(String[] args){
LambdaQs lq = new LambdaQs();
//Lambda表达式的代码块只有一条语句,可以省略花括号
lq.eat(()->System.out.println("苹果的味道不错!"));
//Lambda表达式的形参列表只有一个形参,可以省略圆括号
lq.drive(weather->{
System.out.println("今天的天气是:" + weather);
System.out.println("直升机飞行平稳");
});
//Lambda表达式的代码块只有一条语句,可以省略花括号
//代码块中只有一条语句,即使该表达式需要返回值,也可以省略return关键字
lq.test((a,b)->a + b);
}
}