lambda表達式是如何正確取得參數的?


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

相關文章
相關標籤/搜索