在Java 8中lambda表达式终于被支持了。在其他语言中,匿名函数和lambda表达式早已被广泛使用了。我们常用的Javascript最常见到这一特性:
function test (callback) { callback(); } test(function(){ alert('Hello, world!'); });
在Javascript中,函数被当做一种类型,可以像其他类型一样进行传递和调用。这种灵活的匿名函数模式使得Javascript可以很好的进行异步操作。同样在C#中,由于委托的存在,匿名函数也具有十分重要的价值。
在以往,Java中回调操作的标准方式,是使用接口。可以在使用时创建匿名内部类,就地实现接口来完成。例如一个很常见的AWT事件处理例子:
public interface ActionListener { void actionPerformed(ActionEvent e); } button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Hello, world!"); } });
当我们有了lambda表达式之后,事情会变得更加轻松:
public interface ActionListener { void actionPerformed(ActionEvent e); } button.addActionListener(e -> {System.out.println("Hello, world!");});
Java 8中实现的lambda表达式,和C#的方式如出一辙。lambda表达式有两种写法,一种是单行语句写法,另外一种是语句块写法。单行语句将会把语句表达式的返回值,作为lambda表达式执行后的返回值:
(x,y) -> x+y
和
(x, y) -> { return x + y; }
是等价的。
可能对于普通的回调方法而言,lambda表达式还难以展现出优势,而对于链式方法而言简直就是个福利:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave"); List<String> filteredNames = names .filter(e -> e.length() >= 4) .into(new ArrayList<String>()); for (String name : filteredNames) { System.out.println(name); }
在C#中,这种处理方式被语法糖转化为更加“丧心病狂”的万能查询语言——LINQ。
参考文章:
Java 8 的 lambda 表达式: http://www.oschina.net/question/12_59047
Java 8决定采用跟C#一样的Lambda句法:http://developer.51cto.com/art/201109/290372.htm