interface Eatable {
void eat();
}
interface Flyable {
void fly(String s);
}
interface Addable {
int add(int a, int b);
}
public class LambdaDemo {
//调用该方法需要Eatable对象
public void eat(Eatable e) {
System.out.println(e);
e.eat();
}
//调用该方法需要Flyable对象
public void drive(Flyable f) {
System.out.println("我正在驾驶:" + f);
f.fly("大晴天");
}
//调用该方法需要Addble对象
public void test(Addable a) {
System.out.println("1加1等于:" + a.add(1, 1));
}
public static void main(String[] args) {
LambdaDemo ld = new LambdaDemo();
ld.eat(() -> System.out.println("吃苹果"));
ld.drive(s -> {
System.out.println("今天天气是:" + s);
System.out.println("开车很爽");
});
ld.test((a, b) -> a + b);
}
}
从上面语法格式中可以看出,Lambda表达式就相当于一个匿名方法。它由三部分组成:
省略写法:
从代码中还可以看出,Lambda表达式实际上将会被当成一个“任意类型”的对象,需要当成何种类型,取决于运行环境的需要。
? Lambda表达式的类型也被称为“目标类型”,Lambda表达式的目标类型必须是“函数式接口”。函数式接口代表只包含一个抽象方法的接口。函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法。
? Lambda表达式限制:
其实,Lambda表达式的结果就是被当成对象,所以在程序中完全可以使用Lambda表达式进行赋值。
? 方法引用和构造器引用都需要使用两个英文冒号。如表:
举个例子:
相同点:
区别:
核心接口大致分为以下四类: