java - 方法引用的Lambda转换

  显示原文与译文双语对照的内容

如果我有:


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 而不是 File 。 所以你应该有一个不同的编译错误告诉你这个参数的类型是错误的。

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


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 作为 static 方法访问。 它是一个 static 方法参考 。 而


dir.listFiles(File::isFile); 

或者作为一个 lambda


dir.listFiles((f) -> f.isFile())

引用实例方法引用,它指的是 File 类上的一个( 非静态) 方法。

因此虽然 File::isFile 看起来像一个 static 引用,但是在这个上下文中使用类型实际上是指一个对象 ! 奇怪啊?

作者:
...