λ表达式本质上是一个匿名方法,我们来看一下这个例子。在java1.7中,我们这样写代码:
interface Names {
public void sayName(String name);
}
public class NameExample {
public static void main(String[] args) {
Names nameInstance = new Names() {
@Override
public void sayName(String name) {
System.out.println("My Name is " + name);
}
};
myName(nameInstance, "John");
}
private static void myName(Names nameInstance, String name) {
nameInstance.sayName(name);
}
}
输出 My Name is John
当使用java1.8以后,我们可以使用λ表达式,代码如下:
interface Names {
public void sayName(String name);
}
public class NameExample {
public static void main(String[] args) {
Names nameInstance = name -> System.out.println("My Name is " + name);
myName(nameInstance, "John");
}
private static void myName(Names nameInstance, String name) {
nameInstance.sayName(name);
}
}
λ表达式的目标类型是“函数接口”,这是java1.8的新概念。它的定义是:一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。可以用@FunctionalInterface标注出来。也可以不标注。
注意,这个接口必须只有一个显式声明的抽象方法,其实也比较好理解,在λ表达式中我们根本没有写方法的名称,如果有多个显式的抽象方法的话,那么λ表达式怎么知道应该应用在哪个方法呢?
其实λ表达式的用法非常广泛,这里只是简单介绍一下,也是用的比较多的场景之一。