Java 8 Java 8将多个文件流平面映射到行
给定一个文件名数组:Java 8 Java 8将多个文件流平面映射到行,java-8,java-stream,Java 8,Java Stream,给定一个文件名数组: bigList = Arrays.stream(files) .flatMap(file - > { try { return Files.lines(Paths.get(path + SEPARATOR + file)); } catch (IOException e) { LOGGER.log(Level.WARNING, "No se puede encontrar el a
bigList = Arrays.stream(files)
.flatMap(file - > {
try {
return Files.lines(Paths.get(path + SEPARATOR + file));
} catch (IOException e) {
LOGGER.log(Level.WARNING, "No se puede encontrar el archivo " + file);
}
return null;
})
.filter(str - > str.startsWith("ABC"))
.distinct()
.map(Mapper::mapToObj)
.collect(Collectors.toList());
当我使用传统的for循环(而不是Arrays.stream(..).flatMap(..)
)时,这将返回不同的输出
为什么会这样
提前谢谢
干杯这是因为调用了
distinct()
调用flatmap
时,它将所有文件中的所有行合并到一个流中,因此distinct()
将返回所有文件中不同的行
使用for循环时,您仅对每个文件中的行分别调用distinct()
。因此,当您将它们添加到列表中时,如果同一行存在于不同的文件中,则仍然可能存在重复项。输入和输出示例?@Boristespider您是对的,我修复了它。它是否返回不同的输出,或者只是以不同的顺序返回相同的输出?@Boris the Spider:在flatMap
函数中返回null
与返回空流具有相同的效果。这是显式指定的。@delpo:您正在抵消API。您可以使用path.get(path,file)
,这正是不必处理分隔符的原因。这就是问题所在。谢谢。不客气,顺便说一句,谢谢编辑@Andrew Mairose。
for (String file: files) {
bigList.addAll(Files.lines(Paths.get(path + SEPARATOR + file))
.filter(str - > str.startsWith("ABC"))
.distinct()
.map(Mapper::mapToObj)
.collect(Collectors.toList()));
}