将HashMap内容写入文件

Hel*_*sia 6 java nio hashmap java-8 java-stream

我有一个HashMap<Integer, Integer>.我将其内容写入文件,因此它的每一行都包含hashmapKey:::hashmapValue.这是我现在这样做的方式:

List<String> mLines = new ArrayList<String>();
mHashMap.forEach((key, value) -> mLines.add(key + DATA_SEPARATOR + value));
Files.write(mOutputPath, mLines, StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

我非常怀疑我需要将整个复制HashMap到字符串列表中,我相信在处理大量数据时它会给我带来性能问题.我的问题是:如何HashMap使用Java 8 将内容写入文件,避免在另一个列表中复制值?

Hol*_*ger 14

最简单,非复制,最"流畅"的解决方案是

Files.write(mOutputPath, () -> mHashMap.entrySet().stream()
    .<CharSequence>map(e -> e.getKey() + DATA_SEPARATOR + e.getValue())
    .iterator());
Run Code Online (Sandbox Code Playgroud)

当Stream没有实现时Iterable,执行Stream操作的lambda表达式iterator()可以是以调用流结束的.它将履行合同,因为lambda表达式将与Stream不同,Iterator在每次调用时生成一个新的.

请注意,我删除了显式UTF-8字符集说明符,因为在没有指定charset时java.nio.Files会使用UTF-8(与旧的io类不同).

上述解决方案的优点在于I/O操作包装了Stream处理,因此在Stream内部,我们不必处理已检查的异常.相反,Writer+ forEach解决方案需要处理IOExceptions,因为BiConsumer不允许抛出已检查的异常.因此,使用的工作解决方案forEach看起来像:

try(Writer writer = Files.newBufferedWriter(mOutputPath)) {
    mHashMap.forEach((key, value) -> {
        try { writer.write(key + DATA_SEPARATOR + value + System.lineSeparator()); }
        catch (IOException ex) { throw new UncheckedIOException(ex); }
    });
} catch(UncheckedIOException ex) { throw ex.getCause(); }
Run Code Online (Sandbox Code Playgroud)