从Java 8 开始, 接口可以通过Lambda表达式代替实现类的使用。
Lambda表达式需要函数式接口才可以使用。函数类接口指的是有且仅有一个抽象方法的接口。可通过@FunctionalInterface来检测接口是否为函数式接口。
Lambda表达式使用时根据推断环境推断函数式接口:
①通过参数类型;
②通过赋值语句左侧类型。
Lambda表达式的标准格式:
方法名( (参数) -> ( 语句(方法体)) );
省略的情形与规则:
①参数类型可省略;
②有且仅有一个参数时小括号可省略;
③有且仅有一个语句时大括号与return语句可省略。
样例:
接口:
@FunctionalInterface
public interface Calc {
public abstract int sum(int a, int b);
}
实现类:
public class CalcImp implements Calc{
public int sum(int a, int b) {
return a + b;
}
}
实现:
public class Obj {
public static void main(String[] args) {
CalcImp imp = new CalcImp();
System.out.println("result is: " + imp.sum(10, 20));
}
}
输出:
result is: 30
用Lambda表达式实现:
public class ObjLambda {
public static void main(String[] args) {
sum((int a, int b) -> {return a + b;});
}
public static void sum(Calc c) {
int result = c.sum(10, 20);
System.out.println("result is: " + result);
}
}
输出:
result is: 30