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()));
}