首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8到Java 7代码

Java 8到Java 7代码
EN

Stack Overflow用户
提问于 2016-04-14 03:58:10
回答 3查看 66关注 0票数 0

有人能帮我把这个下载到Java 7吗?你能解释一下你是怎么做到的吗?

代码语言:javascript
复制
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) -> {
}

竞技场目录是一个文件夹。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-14 04:33:00

摆脱Stream最简单的方法是使用增强的for循环。因此,当您在数组A上看到Stream.of时,可以用for (Type x : A)替换它。所以从

代码语言:javascript
复制
for (String file : arenaDirectory.list()) {
}

然后,Stream上的操作将是循环中的操作。第一个是filter,它将消除流中的元素,只保留那些满足条件的元素。这相当于一个if语句:

代码语言:javascript
复制
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中,并声明一个变量来保存新值:

代码语言:javascript
复制
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来做一些事情:

代码语言:javascript
复制
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来查看是否有任何条件匹配,所以您实际上并不需要一个计数器--只要找到匹配的条件,就会中断。

票数 1
EN

Stack Overflow用户

发布于 2016-04-14 06:30:13

首先,让我们清理Java8版本,然后更清楚地说明如何将其重构为循环:

  1. 您的代码没有编译,它需要在其末尾的);
  2. 格式的设置使得破译变得非常困难。我还将把它放在一个用于重构目的的方法中: doSomething() { Stream.of(arenaDirectory.list()) .filter((file) -> Stream.of(新文件,文件).list()) .filter((childName) -> childName.equals(DATA_FILE_NAME)) .count() > 0) .map((文件) ->新文件(ArenaDirectory),) .forEach((arenaFolder) -> {});}
  3. 令人困惑的是,我们没有对结果做任何事情,所以让我们将其传递到System.out.println: doSomething() { Stream.of(arenaDirectory.list()) .filter((file) -> Stream.of(新文件,文件).list()) .filter((childName) -> childName.equals(DATA_FILE_NAME)) .count() > 0) .map((文件) ->新文件(ArenaDirectory),(档案) .forEach(System.out::println);}
  4. 检查流中是否至少有一个项与谓词匹配,最好用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(->)};
  5. 在lambdas中嵌套lambdas是很难理解的,让我们将内部lambda分解成不同的方法: doSomething() { Stream.of(arenaDirectory.list()) .filter(( File ) -> somePredicate(arenaDirectory,file,DATA_FILE_NAME)) .map((file) -> newFile (arenaDirectory,file)) .forEach(System.out::println);}私有布尔somePredicate(文件父,字符串子,字符串expectedName) {File newFile=新文件(父文件,子文件);返回Stream.of(newFile.list()) .anyMatch(newChild -> newChild.equals(expectedName));}
  6. 这使主要方法更加可读性!让我们继续提高可读性..。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));}
  7. 现在我们看到了两次创建同一个文件是多么的多余,所以让我们来清理一下: doSomething() { Stream.of(arenaDirectory.list()) .map((file) ->新文件(arenaDirectory,file)) .filter((dir) -> directoryContainsChildNamed(dir,DATA_FILE_NAME)) .forEach(System.out::println);}私有布尔值directoryContainsChildNamed(File,String expectedName) {返回Stream.of(dir.list()) .anyMatch(子表());}
  8. 实际上,我们根本不需要映射步骤,因为已经有一个将子级作为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。因为我们花了时间把它清理成两个简单的方法,所以转换也相当简单。我们需要用循环来代替流,其余的基本上都到位了:

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-14 06:44:25

事实上,这是一种过于复杂、复杂的做法:

代码语言:javascript
复制
Path f = Paths.get(arenaDirectory.getPath(), file, DATA_FILE_NAME);
if (Files.exists(f)) {
    ...
}

我只能猜测,这可能是为了扫描所有子目录,而File.list()并没有这样做。因为java 7(使用Path和Files)可以轻松地遍历目录树。

解释代码似乎无关紧要,请参阅其他答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36613632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档