I saw this on AngelikaLanger.com and wanted to extract the following portions for my own reference/reminder:
From the java.io.File
source code, we have the following:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| public File[] listFiles(FileFilter filter) {
String ss[] = list();
if (ss == null) {
return null;
}
ArrayList<File> files = new ArrayList<>();
for (String s : ss) {
File f = new File(s, this);
if ((filter == null) || filter.accept(f)) {
files.add(f);
}
}
return files.toArray(new File[files.size()]);
}
|
The above method takes FileFilter
as a parameter. The FileFilter
interface is:
1
2
3
| public interface FileFilter {
boolean accept(File pathname);
}
|
An example usage of this interface (and the listFiles()
method) is:
1
2
3
4
5
6
7
8
9
10
| File myDir = new File("/user/admin/deploy");
if (myDir.isDirectory()) {
File[] files = myDir.listFiles(
new FileFilter() {
public boolean accept(File f) {
return f.isFile();
}
}
);
}
|
The above example uses an anonymous class. We can re-work the above example to use a lambda expression instead of an anonymous class:
1
2
3
4
5
6
| File myDir = new File("/user/admin/deploy");
if (myDir.isDirectory()) {
File[] files = myDir.listFiles(
(File f) -> { return f.isFile(); }
);
}
|
We can do this, in this specific case, because FileFilter
is a functional interface (it only has one method to be implemented).
We can go further (in this specific example) and use a method reference instead of the lambda expression:
1
2
3
4
| File myDir = new File("/user/admin/deploy");
if (myDir.isDirectory()) {
File[] files = myDir.listFiles( File::isFile );
}
|