Lambda表達式可以替代使用的都是函數式接口,Lambda語法是函數式接口的實現。函數式接口是一個只包含一個方法的接口。html
例如:當查詢一個文件夾中某類文件時, 會用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[])中java
先用匿名類的方法, 打印出某目錄下的.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;
}
}
);ide
因爲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函數的..net
參考:
https://blog.csdn.net/meijian531161724/article/details/79762585
http://www.cnblogs.com/yulinfeng/p/8452379.html
htm