Java 方法参考的Lambda转换

Java 方法参考的Lambda转换,java,lambda,java-8,method-reference,Java,Lambda,Java 8,Method Reference,如果我有: 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

如果我有:

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)

我想您已经弄糊涂了:
B::test2
必须是对类B中方法的未绑定实例方法引用,因此lambda参数必须是
B
而不是
文件。因此,您应该得到另一个编译错误,告诉您参数的类型错误。

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

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);
或(扩展为λ)

正在尝试以静态方法访问
test2
。这是一个静态方法引用。鉴于

或者像一只羔羊

dir.listFiles((pathname) -> B.test2(pathname));
dir.listFiles((f) -> f.isFile())
是一个实例方法引用,它引用的是
文件
类上的(非静态)方法


因此,尽管
文件::isFile
看起来像一个静态引用,但在这个上下文中使用类型实际上是指一个对象!奇怪吧?

我想你已经弄糊涂了:
B::test2
必须是类
B
中方法的未绑定实例方法引用,因此lambda参数必须是
B
而不是
文件。因此,您应该得到一个不同的编译错误,告诉您参数的类型是错误的。@Naftalin,谢谢,我看到问题了!!!然而,我写的转换是否正确?你觉得怎么样?是的,转换看起来都不错。
dir.listFiles((f) -> f.isFile())