首页 > 编程笔记

Java Lambda表达式的用法

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

优秀文章