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();
- }