Java 8将多个文件平面映射到行

时间:2016-09-20 14:41:33

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

为什么会这样?

提前致谢

干杯

1 个答案:

答案 0 :(得分:6)

这是因为对distinct()的调用。

当您致电flatmap时,它会将您所有文件中的所有行合并为一个Stream<String>,因此distinct()将返回所有文件中不同的行。

使用for循环时,只需在每个文件中的行上单独调用distinct()。因此,当您将它们添加到列表中时,如果不同文件中存在相同的行,则仍可能存在重复项。