1

如果我有:

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);

4

2 回答 2

2

简短回答:是的,您的转换是正确的。

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看起来像一个静态引用,但在这个上下文中使用类型实际上是在引用一个对象!很奇怪吧?

于 2014-03-19T19:47:42.850 回答
1

我想你很困惑:B::test2必须是对 B 类中方法的未绑定实例方法引用,所以 lambda 参数必须是 aB而不是 a File。所以你应该得到一个不同的编译错误,告诉你参数的类型错误。

于 2014-03-04T02:05:26.137 回答