Java系列-Lambda表达式

Lambda 表达式简介

可以说, Lambda 表达式是函数式编程的一个标志,现如今在 Java 中也加入了这一特性,虽然目前只能算是一个语法糖。
其实在各个语言里面出现的各个 Lamdba 表达式与形式化的λ 演算还是有挺大的差别的。在编程语言中的 Lambda 表达式
本质上是一个匿名函数。特别是对于那些只会使用一次的匿名函数,使用 Lamdba 表达式来表示可以大大提升代码的可读性,以
及缩短代码量。

Lambda 表达式在函数式编程中有着重要的应用。在函数式编程中,函数本身是可以作为一个参数进行传递的。虽然在 Java 中
目前并没有实现这一机制,但是至少在形式上已经迈出了这一步。

Lambda 在Java中的实现

说到 Lamdba 表达式在 Java 中的实现,首先就要介绍一下函数接口的概念,在 Java 中,函数接口是这样定义的:一个接
口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。一般来说会使用 @FunctionalInterface 注解标示,当然
这个注解也可以省略。如下:

    @FunctionalInterface
    public interface Runnable { void run(); }

    public interface Callable<V> { V call() throws Exception; }

    public interface ActionListener { void actionPerformed(ActionEvent e); }

    public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }

以上的接口都是函数接口,但是需要注意的是最后一个接口,虽然有两个抽象方法,但却也是一个函数接口,因为 equals 方法是
Object 的方法。

Lambda 带来的最显著的改变就是对匿名函数的实现,先后实现方法的差别如下:

    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(12,43,10,56,45,90);

        //普通的实现方法
        Collections.sort(numbers, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });

        //第一种 Lambda 表达式的实现
        Collections.sort(numbers, (Integer a, Integer b) -> {
            return a - b;
        });

        //第二种 Lambda 表达式的实现
        Collections.sort(numbers, (Integer a, Integer b) -> a - b);

        //第三种 Lamdba 表达式的实现(不用说明参数类型,上下文可以推测出来参数的类型)
        Collections.sort(numbers, (a,b)-> a - b);

        //现在的集合类都增加了一个foreach方法,这个方法可以很方便的使用 lambda 表达式,就可以不用for循环来便利集合
        numbers.forEach(number -> System.out.println(number));

        numbers.foeEach(System.out::println);
    }

通过上面的例子我们可以发现,其实每一个 Lamdba 事实上就是一个匿名函数的实现,就目前 Java 的 Lamdba 的实现来说,最终
每个 Lamdba 都会被编译成一个实现类。

©2024 Rayjun    PowerBy Hexo