英文:
Method references of listFiles
问题
我曾经从一本关于方法引用的书中阅读过以下代码。
File[] hiddenFiles = new File(".").listFiles(File::isHidden);
当我查阅listFiles
方法的文件API时,我发现它只有以下几种方法:
listFiles(FileFilter filter);
listFiles(FilenameFilter filter);
我尝试过这段代码,它可以工作。但是尽管API说明可以接受FileFilter
或FilenameFilter
,为什么这段代码能够工作呢?
我对File::isHidden
的理解是,它等同于以下的lambda表达式:
(File file) -> file.isHidden();
但在FileFilter
中,需要指定的方法如下。
boolean accept(File pathname);
那么在这里不应该有一个名为accept
的方法吗,就像这样:
File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isHidden();
}
});
或者编译器是否可以自动检测模式,并将代码视为FileFilter
,尽管方法accept
未被定义且未创建FileFilter
对象?
英文:
I have once read the following code from a book about method references.
File[] hiddenFiles = new File(".").listFiles(File::isHidden)
When I look up from the File API for the listFiles
method, I see it only has the following methods:
listFiles(FileFilter filter)
listFiles(FilenameFilter filter)
I have tried the code and it works. But while the API states it accepts either FileFilter
or FilenameFilter
, why the code can work ?
My understanding of File::isHidden is that it is equivalent to the following lambdas:
(File file) -> file.isHidden()
But in FileFilter, the method that need to specify is following.
boolean accept(File pathname)
Then shouldn't there be a method named accept defined there, like:
File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isHidden();
}
});
Or the compiler can somehow automatically detect the pattern and regard the code as a FileFilter, although the method "accept" is not defined and a FileFilter object is not created ?
答案1
得分: 4
以下是翻译好的内容:
有几个有趣的部分涉及到这个问题:
-
问题:什么是
isHidden
,为什么它可以作为 File.listFiles() 的一个可接受参数?https://www.geeksforgeeks.org/file-ishidden-method-in-java-with-examples
isHidden() 函数是 Java 中 File 类的一部分。此函数确定由抽象文件名表示的文件或目录是否是隐藏的。如果抽象文件路径是隐藏的,则该函数返回 true,否则返回 false。
-
问题:什么是
File::isHidden
的语法?"双冒号" 是 方法引用。它在 Java 8 及更高版本中新增。
-
问题:那么为什么 isHidden() 是可接受的 FileFilter 参数呢?
https://docs.oracle.com/javase/8/docs/api/java/io/FileFilter.html
这是一个函数式接口,因此可以用作 lambda 表达式或方法引用的赋值目标。
File::isHidden
是一个返回 "true" 或 "false" 的 lambda 表达式。
英文:
There are actually several interesting parts to this question:
-
Q: What is
isHidden
, and why is it a permissible argument to File.listFiles()?> https://www.geeksforgeeks.org/file-ishidden-method-in-java-with-examples
>
> The isHidden() function is a part of File class in Java . This
> function determines whether the is a file or Directory denoted by the
> abstract filename is Hidden or not.The function returns true if the
> abstract file path is Hidden else return false. -
Q: What is the
File::isHidden
syntax?The "double colon" is a method reference. It's new with Java 8 and higher.
-
Q: So why is isHidden() an acceptable FileFilter parameter?
> https://docs.oracle.com/javase/8/docs/api/java/io/FileFilter.html
>
> This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.File::isHidden
is a lambda expression that returns "true" or "false".
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论