java - 有没有办法将 Stream 的结果转换为 Array 并遍历 Array 元素?
问题描述
我创建了一个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();
}
解决方案
您发布的代码存在一些问题。
- 你打电话
stream.stream()
- 该类
Stream
没有stream()
方法。拥有这样的方法是没有意义的,因为它已经是一个流。
- 该类
- 你打电话
x.getName()
- 此时,
x
是一个Path
没有getName()
方法的。您可以使用getFileName()
, 返回 aPath
或toString()
, 将路径作为字符串返回,或者将两者结合以仅获取文件名作为字符串。
- 此时,
- 您分配
List<String> collect
给 的结果Collection.toArray()
。- 该方法返回一个
Object[]
.
- 该方法返回一个
- 你
collect(Collectors.toList())
在调用之前使用toArray()
。- 该类
Stream
有一个toArray()
方法,如果数组是所需的最终结果,则没有理由首先收集到列表中。
- 该类
- 您使用
toArray()
which 返回Object[]
(forStream
和Collection
)- 你想要一个
String[]
which 意味着,因为不需要先收集,你需要调用Stream.toArray(IntFunction)
.
- 你想要一个
- 您在块
stream
外使用。try
- 由于
stream
是try
块本地的,因此您不能在try
块外使用它。您也没有理由在块外使用它,因为您只需要String[]
结果。
- 由于
- 你试图做类似的事情
stream[]
。- A
Stream
不是数组,不能像数组一样访问。此外, aStream
不是容器而是管道;试图访问其中的某些元素是没有意义的。 - 这也适用于
stream.length
因为Stream
没有length
字段(同样,因为它不是数组)。
- A
解决这些问题,您的代码可能类似于以下内容(基于您的代码的当前形式,因为我不确定您到底要做什么):
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
.