Lambda表达式能够替代使用的都是函数式接口,Lambda语法是函数式接口的实现。函数式接口是一个只包含一个方法的接口。
例如:当查询一个文件夹中某类文件时, 会用File.listFiles函数.
public File[] listFiles(@Nullable java.io.FilenameFilter filter)
File.listFiles函数接收一个FilenameFilter类型的参数, 它是一个接口:
public interface FilenameFilter
它只含有一个方法:
boolean accept(File dir, String name), 用来测试某文件是否应包含在满足条件的 file list(也就是File.listFiles函数的返回值File[])中
先用匿名类的方法, 打印出某目录下的.exe文件:
File[] exeFiles = exeFolder.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if (name.length() > 4) {
return (new File(dir, name)).isFile() &&
name.substring(name.length() - 4).equalsIgnoreCase(".exe");
} else {
return false;
}
}
});
若是在IntelliJ中编程则在"new FilenameFilter()"下面会出现灰色浪线, 提示"建议使用Lambda表达式代替之.
改用Lambda表达式的写法:
File[] exeFiles = exeFolder.listFiles((File dir, String name) ->{
if(name.length() > 4 ){
return (new File(dir,name)).isFile() &&
name.substring(name.length() - 4).equalsIgnoreCase(".exe") ;
}
else {
return false;
}
}
);
由于File.listFiles函数接收一个FilenameFilter类型的参数, 而这个接口只有一个函数, 所以这里(File dir, String name) 必然是这个函数的参数列表.
JDK API:
boolean accept(File dir, String name)
Tests if a specified file should be included in a file list.
Parameters:
dir - the directory in which the file was found.
name - the name of the file.
所以这里dir 和name可以看成是JVM"注入"给accept函数的.
参考:
https://blog.csdn.net/meijian531161724/article/details/79762585
http://www.cnblogs.com/yulinfeng/p/8452379.html