首页 > 解决方案 > 有没有办法将 Stream 的结果转换为 Array 并遍历 Array 元素?

问题描述

我创建了一个Stream通过多个文件和文件夹递归运行。我需要将结果转换StreamArray并遍历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();
    }

标签: javaarraysstreamjava-stream

解决方案


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

  1. 你打电话stream.stream()
    • 该类Stream没有stream()方法。拥有这样的方法是没有意义的,因为它已经是一个流。
  2. 你打电话x.getName()
    • 此时,x是一个Path没有getName()方法的。您可以使用getFileName(), 返回 aPathtoString(), 将路径作为字符串返回,或者将两者结合以仅获取文件名作为字符串。
  3. 您分配List<String> collect给 的结果Collection.toArray()
    • 该方法返回一个Object[].
  4. collect(Collectors.toList())在调用之前使用toArray()
    • 该类Stream有一个toArray()方法,如果数组是所需的最终结果,则没有理由首先收集到列表中。
  5. 您使用toArray()which 返回Object[](forStreamCollection
  6. 您在块 stream外使用。try
    • 由于streamtry块本地的,因此您不能在try块外使用它。您也没有理由在块外使用它,因为您只需要String[]结果。
  7. 你试图做类似的事情stream[]
    • AStream不是数组,不能像数组一样访问。此外, aStream不是容器而是管道;试图访问其中的某些元素是没有意义的。
    • 这也适用于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.


推荐阅读