我正在探索Java 8源代码,发现代码的这一特定部分非常令人惊讶:
//defined in IntPipeline.java
@Override
public final OptionalInt reduce(IntBinaryOperator op) {
return evaluate(ReduceOps.makeInt(op));
}
@Override
public final OptionalInt max() {
return reduce(Math::max); //this is the gotcha line
}
//defined in Math.java
public static int max(int a, int b) {
return (a >= b) ? a : b;
}
Run Code Online (Sandbox Code Playgroud)
是Math::max
什么样的方法指针?普通static
方法如何转换为IntBinaryOperator
?
假设一个非常简单的程序列出了给定目录的所有子目录.声音够简单?除了列出Java中所有子目录的唯一方法是使用FilenameFilter与File.list()结合使用.
这适用于简单的情况,但是当文件夹说出150,000个文件和2个子文件夹时,它在那里愚蠢地等待45秒,遍历所有文件并测试file.isDirectory().是否有更好的方法列出子目录?
PS.对不起,请保存有关在同一目录中包含太多文件的讲座.我们的现场环境将此作为要求的一部分.
考虑到Java 8中存在"新" 流API,我可以使用Files.walk
迭代文件夹.如果使用此方法或者深度= 2,我怎么才能获取给定目录的子文件夹?
我目前有这个工作示例,遗憾的是还将根路径打印为所有"子文件夹".
Files.walk(Paths.get("/path/to/stuff/"))
.forEach(f -> {
if (Files.isDirectory(f)) {
System.out.println(f.getName());
}
});
Run Code Online (Sandbox Code Playgroud)
因此,我恢复了以下方法.它将文件夹存储在内存中,然后需要处理存储的列表,我会避免使用lambdas.
File[] directories = new File("/your/path/").listFiles(File::isDirectory);
Run Code Online (Sandbox Code Playgroud)