简述
Lambda 表达式可以理解成是一个匿名函数,在函数式编程语言和脚本语言中比较常见,例如Haskell,Python等语言中都有实现,在面向对象语言中的C#中也很早引入了Lambda表达式,并且配合LINQ极大的简化了开发难度,提高了开发效率。
Java 则是在JDK1.8的新特性中引入 Lambda 表达式,本文将对 Java 的 Lambda 表达式进行介绍,并且结合其他语言中的使用做下对比。
在 JDK 以前的版本中,当使用匿名内部类或接口来实现回调的时候,假如匿名内部类或接口只有一个方面需要实现时,代码显得非常的丑陋,繁琐,为了应对类似的问题,可以使用 Lambda 表达式来作为函数的参数或者返回值使用,简化代码,写出更漂亮的代码。下面用创建线程的代码来感受下 Lambda 的魅力: ```Java // 不使用 Lambda Thread thread_without_lambda = new Thread(new Runnable() { @Override public void run() { System.out.println(“Thread without Lambda”); } });
thread_without_lambda.start();
// 使用 Lambda Thread thread_with_lambda = new Thread(() -> { System.out.println(“Thread with Lambda”); });
thread_with_lambda.start(); ``` 虽然是一个很简单的实例,但是可以明显看出来,使用 Lambda 表达式的代码显得更加简洁,并且可读性更高了。
语法
下面来看下如何编写一个神奇的 Lambda 表达式。
Java
(type parameters) -> expression / {statements}
使用括号()
包裹用逗号,
分割的参数列表,参数的类型可以省略,后面紧跟一个 ->
,然后是表达式 或 大括号包裹的语句段,如果是表达式的话,Java运行时会自动返回表达式的值。
```Java
(p1, p2) -> p1 + p2
等价于
(p1, p2) -> {return p1 + p2;} ```
How to
Java 中 Lambda 必须与 函数接口 配合使用, 函数接口是指只有一个方法的接口,需要使用 @FunctionalInterface
注解。这样就可以愉快的使用 Lambda 表达式来编写代码。
Java 为了让我们感受 Lambda 的魅力,已经将之前版本的一些接口改成了函数接口,例如常用的 Comparator。除此之外,在 JDK 1.8 中还提供了许多新的函数式接口,例如:Fucntion,Comsumer,Predicate,Supplier等,使用这些接口和它们的实现类可以帮助我们完成一些简单的 Lambda 使用,如果需要定制化的功能,那就需要自己实现函数接口啦,实现起来也是非常的简单。 ```Java @FunctionalInterface public interface IntMathInterface{ int calculate(int param1, int param2); }
public LambdaTest{
public void doMath(int x, int y, IntMathInterface intMath){ System.out.println(“result = “ + intMath.calculate(x, y)); }
public static void main(String[] args){ LambdaTest test = new LambdaTest(); IntMathInterface addMath = (a, b) -> a + b; test.doMath(20, 30, addMath); } } ```
Stream
JDK 1.8 还引入了 Stream 这个酷炫拽的API,使用它可以把 Lambda 的功能发挥到极致,给予开发者前所未有的开发体验。(不过话说回来,这货有点LINQ的意思,呵呵呵)
Stream API提供了丰富的聚合函数,例如map,filter,foreach等,它们都接收函数接口作为参数,这样就可以使用 Lambda 表达式来完成想要的工作了。关于Stream API的内容会在后面的文章中介绍。
其他语言中的Lambda
-
PHP
由于在PHP中函数是一等公民,所以PHP直接支持函数作为参数的使用,也就可以直接使用匿名函数来完成相同的工作。
php $results = array_filter($arr, function($item) use ($val){ return $item == $val; });
-
Python
虽然在Python中函数同样是一等公民,但是还是提供了 Lambda 表达式。
python lambda parameters : statements
-
C#
C# 可以通过委托的方式来实现函数作为参数或返回值使用的需求,并且很早就提供了 Lambda 表达式的使用。 ```C# (input parameters) => expression
等价于
delegate(input parameters) { statements } ```
-
Swift
swift { (parameters) -> returnType in statements }
总结
Lambda 表达式的引入给 Java 开发者带来了新的编程体验,摆脱了丑陋且繁琐的代码,使得代码的可读性更强,开发效率更高。并且Java也提供了能够很好的应用 Lambda 表达式的辅助API,这也让开发者不得不向其靠拢。希望伴随着 JDK 的不断更新, Lambda 表达式能给开发者带来更多的惊喜。