JDK8-1-Lambda表达式(1)-简介
Lambda也称为匿名函数,是 JDK8 的新特性之一,它允许程序将方法作为值传递(类似JS中的回调方法),相比 JDK8 之前的代码,Lambda语法更简洁。
看一个简单的例子,列出目录中的文件夹:
import java.io.File;
import java.io.FileFilter;
public class FileFilterTest {
private static final String MUSIC_DIR = "F:\\My_Music";
public static File[] listDirectory(File file) {
return file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory();
}
});
}
public static void main(String[] args) {
File musicDir = new File(MUSIC_DIR);
File[] files = listDirectory(musicDir);
for (File f : files) {
System.out.println(f.getName());
}
}
}
此例使用JDK8之前的语法,其中 listFiles的入参为 FileFilter 类型,此处创建了一个匿名类对象, 用 Lambda 语法改造如下:
import java.io.File;
public class FileFilterTest2 {
private static final String MUSIC_DIR = "F:\\My_Music";
public static File[] listDirectory1(File file) {
return file.listFiles((File pathname) -> {
return pathname.isDirectory();
});
}
public static File[] listDirectory2(File file) {
/**
* 方法体中只有一行代码,所以{} return ;可以省略
*/
return file.listFiles(pathname -> pathname.isDirectory());
}
public static File[] listDirectory3(File file) {
/**
* 方法引用::语法(即“把这个方法作为值”)
*/
return file.listFiles(File::isDirectory);
}
public static void main(String[] args) {
File musicDir = new File(MUSIC_DIR);
File[] files = listDirectory3(musicDir);
for (File f : files) {
System.out.println(f.getName());
}
}
}
其中 listDirectory3 方法中仅有一行代码:
file.listFiles(File::isDirectory);
::是Java 8中的方法引用语法(即“把这个方法作为值”)将其传给listFiles方法