lambda表达式是如何正确取得参数的?


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
 

转载于:https://my.oschina.net/u/344631/blog/2989894

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值