如果我有:
class B
{
public static boolean test1(File f)
{
return true;
}
public boolean test2(File f)
{
return true;
}
}
以下对完整 lambda 表达式的转换是否正确?
File dir = new File("C:\\TEST");
// here UNBOUND instance method reference
// converted as? dir.listFiles((File f) -> f.isFile());
dir.listFiles(File::isFile);
// here static method reference
// converted as? dir.listFiles((File f) -> B.test1(f));
dir.listFiles(B::test1);
// here BOUND instance method reference
// converted as? dir.listFiles((File f) -> b.test2(f));
B b = new B();
dir.listFiles(b::test2);
那么,还有一个问题:
如果我写:dir.listFiles(B::test2);
我从编译器那里得到:
non-static method test2(File) cannot be referenced from a static context
但为什么不抛出该错误:dir.listFiles(File::isFile);
最佳答案
简短回答:是的,您的转换是正确的。
public void question() {
File dir = new File("C:\\TEST");
// here UNBOUND instance method reference
dir.listFiles((File f) -> f.isFile());
dir.listFiles(File::isFile);
// here static method reference
dir.listFiles((File f) -> B.test1(f));
dir.listFiles(B::test1);
// here BOUND instance method reference
B b = new B();
dir.listFiles((File f) -> b.test2(f));
dir.listFiles(b::test2);
}
编译问题是因为引用;
dir.listFiles(B::test2);
或(扩展为 lambda);
dir.listFiles((pathname) -> B.test2(pathname));
正在尝试以静态方法访问 test2
。这是一个静态方法引用。鉴于
dir.listFiles(File::isFile);
或作为 lambda;
dir.listFiles((f) -> f.isFile())
是一个实例方法引用,它指的是File
类中的一个(非静态)方法。
因此,尽管 File::isFile
看起来像一个静态引用,但在此上下文中使用 type 实际上是在引用一个对象!很奇怪吧?
关于java - 方法引用的 Lambda 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21140954/