我创建了一个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();
}
答案 0 :(得分:1)
您发布的代码存在一些问题。
stream.stream()
Stream
类没有stream()
方法。拥有这样的方法对它来说是没有意义的,因为它已经是流。x.getName()
x
是一个Path
,没有getName()
方法。您可以使用getFileName()
返回一个Path
,或使用toString()
返回一个字符串的路径,或者将两者结合起来以仅获取文件名作为字符串。List<String> collect
分配给Collection.toArray()
的结果。
Object[]
。collect(Collectors.toList())
之前使用toArray()
。
Stream
类具有toArray()
方法,如果数组是所需的最终结果,则没有理由首先收集到列表中。toArray()
返回Object[]
(Stream
和Collection
都返回)
String[]
,这意味着由于不需要先收集,因此您需要致电Stream.toArray(IntFunction)
。stream
块外使用try
。
stream
是try
块的本地对象,因此不能在try
块之外使用它。您也没有理由在块外使用它,因为您只需要String[]
结果。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
。