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 都会被编译成一个实现类。