有人能帮我把这个下载到Java 7吗?你能解释一下你是怎么做到的吗?
Stream.of(arenaDirectory.list()).filter((file) ->
Stream.of(new File(arenaDirectory, file).list()).filter((childName) -> childName.equals(DATA_FILE_NAME)).count() > 0
).map((file) -> new File(arenaDirectory, file)).forEach((arenaFolder) -> {
}竞技场目录是一个文件夹。
发布于 2016-04-14 04:33:00
摆脱Stream最简单的方法是使用增强的for循环。因此,当您在数组A上看到Stream.of时,可以用for (Type x : A)替换它。所以从
for (String file : arenaDirectory.list()) {
}然后,Stream上的操作将是循环中的操作。第一个是filter,它将消除流中的元素,只保留那些满足条件的元素。这相当于一个if语句:
for (String file : arenaDirectory.list()) {
if (Stream.of(new File(arenaDirectory, file).list()).filter((childName) -> childName.equals(DATA_FILE_NAME)).count() > 0) {
}
}注意,由于我为循环变量选择了与lambda中使用的原始代码相同的名称,所以很容易将lambda表达式的谓词部分复制到if中。
现在您有了map,它对过滤器没有消除的元素进行操作,并将它们转换为新的元素。因此,您将把操作放在if中,并声明一个变量来保存新值:
for (String file : arenaDirectory.list()) {
if (Stream.of(new File(arenaDirectory, file).list()).filter((childName) -> childName.equals(DATA_FILE_NAME)).count() > 0) {
File arenaFolder = new File(arenaDirectory, file);
}
}同样,我选择了与下一个lambda中使用的代码相同的变量名。
然后代码有forEach,这意味着对map返回的新值执行操作--在本例中,该值是上面创建的arenaFolder变量。在这里,我不知道代码是什么,因为你的帖子有空的大括号。但是不管它是什么,你都会把它放在最后一条语句之后;它将使用arenaFolder来做一些事情:
for (String file : arenaDirectory.list()) {
if (Stream.of(new File(arenaDirectory, file).list()).filter((childName) -> childName.equals(DATA_FILE_NAME)).count() > 0) {
File arenaFolder = new File(arenaDirectory, file);
// code that does something with arenaFolder
}
}现在,您所要做的就是按照相同的步骤向下处理嵌套的流。与count()操作不同,您必须保持自己的计数器遍历循环,并在"filter“条件为真时增加它。或者,由于您只是使用count来查看是否有任何条件匹配,所以您实际上并不需要一个计数器--只要找到匹配的条件,就会中断。
发布于 2016-04-14 06:30:13
首先,让我们清理Java8版本,然后更清楚地说明如何将其重构为循环:
);。anyMatch执行:
doSomething() { Stream.of(arenaDirectory.list()) .filter((file) -> Stream.of(新文件,文件).list()) .anyMatch((childName) -> childName.equals(DATA_FILE_NAME) .map((file) -> new File(arenaDirectory,file)) .forEach(->)};somePredicate方法令人困惑,因为它检查它构造的文件的子元素,而不是给定的文件。把它清理干净。主要的方法会变得更糟,但是我们稍后会清理它:
doSomething() { Stream.of(arenaDirectory.list()) .filter(( File ) -> {file=新文件(arenaDirectory,file);返回directoryContainsChildNamed( dir,DATA_FILE_NAME);}) .map((file) ->新文件(arenaDirectory,file)) .forEach(System.out::println);}私有布尔directoryContainsChildNamed(File,String expectedName) {返回Stream.of(dir.list()) .anyMatch(子-> child.equals(expectedName));}File[]返回的API:
doSomething() { Stream.of(arenaDirectory.listFiles()) .filter((file) -> directoryContainsChildNamed(file,DATA_FILE_NAME)) .forEach(System.out::println);}私有布尔directoryContainsChildNamed(File,String ){返回Stream.of(dir.list()) .anyMatch(child -> child.equals( expectedName) );}好了,现在我们有进展了!这是不错的干净Java 8,但是您想要Java 7。因为我们花了时间把它清理成两个简单的方法,所以转换也相当简单。我们需要用循环来代替流,其余的基本上都到位了:
public void doSomething() {
for (File file : arenaDirectory.listFiles()) {
if (directoryContainsChildNamed7(file, DATA_FILE_NAME)) {
System.out.println(file); // whatever you wanted to do...
}
}
}
private boolean directoryContainsChildNamed(File dir, String expectedName) {
for (String child : dir.list()) {
if (child.equals(expectedName)) return true;
}
return false;
}发布于 2016-04-14 06:44:25
事实上,这是一种过于复杂、复杂的做法:
Path f = Paths.get(arenaDirectory.getPath(), file, DATA_FILE_NAME);
if (Files.exists(f)) {
...
}我只能猜测,这可能是为了扫描所有子目录,而File.list()并没有这样做。因为java 7(使用Path和Files)可以轻松地遍历目录树。
解释代码似乎无关紧要,请参阅其他答案。
https://stackoverflow.com/questions/36613632
复制相似问题