Java系列-Lambda表达式

Lambda 表达式简介

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

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

Lambda 在Java中的实现

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

1
2
3
4
5
6
7
8
@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 带来的最显著的改变就是对匿名函数的实现,先后实现方法的差别如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 都会被编译成一个实现类。

微信公众号

© 2018 ray