我有一个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);
我非常怀疑我是否需要复制整个HashMap
对于字符串列表,我确信在处理大量数据时它会给我带来性能问题。我的问题是:我该如何写HashMap
使用 Java 8 将内容写入文件以避免复制另一个列表中的值?
最简单、非复制、最“流”的解决方案是
Files.write(mOutputPath, () -> mHashMap.entrySet().stream()
.<CharSequence>map(e -> e.getKey() + DATA_SEPARATOR + e.getValue())
.iterator());
虽然 Stream 没有实现Iterable
,执行 Stream 操作并以调用结束的 lambda 表达式iterator()
就流,可以。它将履行合同,因为 lambda 表达式将与 Stream 不同,生成一个新的Iterator
在每次调用时。
请注意,我删除了显式的UTF-8
字符集说明符为java.nio.Files
将使用UTF-8
当没有指定字符集时(与旧的 io 类不同)。
上述解决方案的巧妙之处在于,I/O 操作包装了 Stream 处理,因此在 Stream 内部,我们不必处理已检查的异常。相比之下,Writer
+forEach
解决方案需要处理IOException
s as a 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(); }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)