有没有一种方法可以将Stream的结果转换为Array并通过Array元素进行迭代?

时间:2019-04-07 02:11:33

标签: java arrays stream java-stream

我创建了一个Stream以递归地运行多个文件和文件夹。我需要将Stream的结果转换为Array并遍历Array的结果。

我在使用以下代码时遇到问题:

try (Stream<Path> stream = Files.walk(start, Integer.MAX_VALUE)) {
        List<String> collect = stream
            .stream().map(x->x.getName())
            .filter(s -> s.toString().endsWith(".txt"))
            .sorted()
            .collect(Collectors.toList())
            .toArray();

        collect.forEach(System.out::println);
    }

    String[] listfiles = new String[stream.length];
    for (int i = 0; i < stream.length; i++) {
       listfiles[i] = stream[].getName();
    }

1 个答案:

答案 0 :(得分:1)

您发布的代码存在一些问题。

  1. 您致电stream.stream()
    • Stream类没有stream()方法。拥有这样的方法对它来说是没有意义的,因为它已经是流。
  2. 您致电x.getName()
    • 此时,x是一个Path,没有getName()方法。您可以使用getFileName()返回一个Path,或使用toString()返回一个字符串的路径,或者将两者结合起来以仅获取文件名作为字符串。
  3. 您将List<String> collect分配给Collection.toArray()的结果。
    • 该方法返回一个Object[]
  4. 您在致电collect(Collectors.toList())之前使用toArray()
    • Stream类具有toArray()方法,如果数组是所需的最终结果,则没有理由首先收集到列表中。
  5. 您使用toArray()返回Object[]StreamCollection都返回)
  6. 您在stream块外使用try
    • 由于streamtry块的本地对象,因此不能在try块之外使用它。您也没有理由在块外使用它,因为您只需要String[]结果。
  7. 您尝试执行类似stream[]的操作。
    • Stream不是数组,不能像一个数组那样访问。另外,Stream不是容器,而是管道。尝试访问其中的某些元素没有任何意义。
    • 这也适用于stream.length,因为Stream没有length字段(再次,因为它不是数组)。

解决这些问题后,您的代码可能类似于以下内容(基于当前的代码形式,因为我不确定您要确切执行的操作):

String[] result;
try (Stream<Path> stream = Files.walk(start, Integer.MAX_VALUE)) {
    result = stream.map(Path::toString)
            .filter(s -> s.endsWith(".txt"))
            .sorted()
            .toArray(String[]::new);
}

for (int i = 0; i < result.length; i++) {
    // do something
}

您还可以考虑使用Files.find(Path,int,BiPredicate,FileVisitOption...)和/或PathMatcher