我有一个类用于遍历目录树并对每个文件/目录执行操作。看起来像这样:
class DirWalker {
public static void walkDirs(Path startingPath, Consumer<Path> vAction) {...}
}
在另一堂课上我有以下内容:
public static Consumer<Path> doVisit = p -> {...}
我尝试在我的 Java 代码中使用它,如下所示:
DirWalker.walkDirs(/* a path */, MyClass::doVisit);
但是,我在这里收到错误消息“MyClass 没有定义适用于此处的 doVisit(Path)”。我可以将
doVisit
成员更改为方法并且它可以工作。
如果我在
walkDirs
调用中使用 lambda 内联,它会工作得很好。但是创建 Consumer
的实例并将其传递给 walkDirs
方法会失败。为什么会这样?
仅当 doVisit 是方法时,您才可以使用方法引用语法 (
MyClass::doVisit
)。正如您所声明的那样, doVisit 是一个字段,应该以 MyClass.doVisit
的形式访问
如果要使用方法引用语法,可以将其编写为满足
Consumer<Path>
接口的方法,而不是内联 lambda 表达式,如下所示
public static void doVisit(Path p) {
...
}
您的
doVisit
是 Consumer
的实例。所以你不能使用方法引用。只需将引用传递给您的 walkDirs
方法即可。
import java.nio.file.Path;
import java.util.function.Consumer;
public class MyClass {
public static Consumer<Path> doVisit = path -> {};
public static void main(String[] args) {
DirWalker.walkDirs(Path.of("/tmp"), doVisit); // Static
}
public static class DirWalker {
public static void walkDirs(Path startingPath, Consumer<Path> vAction) {
}
}
}
如果要引用该字段,请使用
instance.doVisit
:
import java.nio.file.Path;
import java.util.function.Consumer;
public class MyClass {
public Consumer<Path> doVisit = path -> {};
public static void main(String[] args) {
MyClass instance = new MyClass();
DirWalker.walkDirs(Path.of("/tmp"), instance.doVisit); // Instance
}
public static class DirWalker {
public static void walkDirs(Path startingPath, Consumer<Path> vAction) {
}
}
}