Lambda 表达式是一个匿名函数(指的是没有函数名的函数),它基于数学中的λ演算得名,直接对应于其中的 Lambda 抽象。Lambda 表达式可以表示闭包(注意和数学传统意义上的不同)。
Lambda 表达式允许把函数作为一个方法的参数。Lambda 表达式的基本语法如下所示:
(parameters) -> expression
或
(parameters) ->{ statements; }
Lambda 的使用如下例所示:
Arrays.asList( 1, 7, 2 ).fbrEach( i -> System.out.println( i));
以上这种写法中,i 的类型由编译器推测出来的,当然,也可以显式地指定类型,如下例所示:
Arrays.asList( 1, 7, 2 ).forEach( (Integer i) -> System.out.println( i));
在 Java 8 以前,Java 语言通过匿名函数的方法来代替 Lambda 表达式。
对于列表的排序,如果列表里面存放的是自定义的类,那么通常需要指定自定义的排序方法,传统的 Java 写法如下所示:
import java.util.Arrays;
import java.util.Comparator;
class Person {
public Person(String name, int age) {
this.name = name;
this.age = age;
}
private String name;
private int age;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public String toString() {
return name + ":" + age;
}
}
public class Test {
public static void main(String[] args) {
Person[] people = {new Person("James", 25), new Person("Jack", 21)};
//自定义类排序方法,通过年龄进行排序
Arrays.sort(people, new Comparator<Person>() {
@Override
public int compare(Person a, Person b) {
return a.getAge() - b.getAge();
}
});
for (Person p : people) {
System.out.println(p);
}
}
}
采用 Lambda 表达式后,写法如下所示:
Arrays.sort(people, (Person a, Person b) -> a.getAge()-b.getAge());
或
Arrays.sort(people, (a, b) -> a.getAge()-b.getAge());
显然,采用 Lambda 表达式后,代码会变得更加简洁。
Lambda表达式是通过函数式接口(只有一个方法的普通接口)来实现的。函数式接口可以被隐式地转换为Lambda表达式。
为了与普通的接口区分开(普通接口中可能会有多个方法),JDK1.8 新增加了一种特殊的注解 @FunctionalInterface。下面给出一个函数式接口的定义:
@FunctionalInterface
interface fun {
void f();
}