在java1.6,我们会写出这样的代码:
File f = new File("/"); String[] arr = f.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".txt"); } });
java 1.8支持了lambda表达式后,我们就可以这样写了:
File f = new File("/"); String[] arr = f.list((dir, name) -> name.endsWith(".txt"));
7行代码减到2行,是不是简洁了很多
我们来分析一下(dir, name) -> name.endsWith(".txt")这一段。
(dir,name)这里写的是输入参数。对应:accept(File dir, String name) 。因为编译器可以推荐出dir和name的类型,所以在这时不用再一次声明它的类型。
-> 是分隔符,表明后面跟的是具体的逻辑主体。这里只有一行代码,所以可以不用{}。如果有多行代码,可以这样写:
File f = new File("/"); String[] arr = f.list((dir, name) -> { System.out.println(name); //do something return name.endsWith(".txt"); });
同样的道理我们也可以写出下面这样的代码:
Thread t = new Thread(() -> { int a=123; System.out.println("test " + a); }); t.start();
只要某个接口只有一个抽象方法,我们就可以用lambda表达式的方式来简化我们的代码。
参考文档:
http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
http://www.iteye.com/magazines/129-Java-8-Tutorial