给定一组文件名:
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(..))时,这会返回不同的输出
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()));
}
为什么会这样?
提前致谢
干杯
答案 0 :(得分:6)
这是因为对distinct()
的调用。
当您致电flatmap
时,它会将您所有文件中的所有行合并为一个Stream<String>
,因此distinct()
将返回所有文件中不同的行。
使用for循环时,只需在每个文件中的行上单独调用distinct()
。因此,当您将它们添加到列表中时,如果不同文件中存在相同的行,则仍可能存在重复项。