为什么要在Java中加入Lambda表达式

Lambda表达式(以及闭包)在许多现代编程语言中都很普及。在为什么要在 Java 平台加入 Lambda 表达式呢?有众多原因中,最主要的原因是在编程时,可以让多线程并行处理 Collection(译注:包括 List 和 Set) 的代码变得容易编写。一般情况,我们写代码操作 List 和 Set,是先获取其迭代器(iterator),然后通过迭代器遍历每个元素,并依次处理。如果我们想要以并行的方式来处理不同的元素,只能我们自己编写代码来处理,Collection 并不提供任何支持。

在 Java 8 中,意图给 Collection 提供一些方法,我们可以给那些方法传入函数,然后方法内部再调用传入的函数去处理 Collection 中的元素。(后面我们会以 forEach 方法作一个例子,传一个函数给它去处理每一个元素)。这个变化会带来一个优点,那就是 Collection 可以在它的内部进行迭代,把客户代码的职责转移到库中。

然后,对客户代码来说,我们还需要提供一个简单的办法来把函数传给 Collection 的那些方法。目前的标准做法是,创建相应接口的一个匿名内部类。但是定义匿名内部类的语法太笨拙了。

例如,Collection 的 forEach 方法接受 Consumer 接口的一个实例,并且为每个元素调用它的accept方法:

interface Consumer<T> {void accept(T t);}

现在假设我们有一个 list,list 内的元素都是 java.awt.Point 类型的,我们想要使用 forEach 方法来交换每个元素的x和y的值。使用匿名内部类的方式如下:

pointList.forEach(new Consumer<Point>(){  

  public void accept(Point p){  
    p.move(p.y, p.x);  
  }  
});

如果使用 Lambda 表达式,就简洁得多了:

pointList.forEach(p -> p.move(p.y, p.x));

Tagged:

Comments are closed.