java - 将HashMap内容写入文件

标签 java hashmap java-8 nio 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);

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

最佳答案

最简单,最不复制,最“精简”的解决方案是

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

尽管Stream不实现Iterable,但执行Stream操作的lambda表达式可以以在该流上调用iterator()结尾。它会履行契约(Contract),因为lambda表达式将与Stream不同,在每次调用时都会产生一个新的Iterator

请注意,我删除了显式的UTF-8字符集说明符,因为在未指定任何字符集的情况下(与旧的io类不同),java.nio.Files将使用UTF-8

上述解决方案的优点是I/O操作包装了Stream处理,因此在Stream内部,我们不必处理已检查的异常。相反,Writer + forEach解决方案需要处理IOException,因为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(); }

关于java - 将HashMap内容写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37527177/

相关文章:

java - 将代码从 python 转换为 Java

intellij-idea - 在 lambda 中进行转换,在 IntelliJ 中标记为冗余

java - 将 lambda 作为具有泛型类型的参数传递 - java 8

java - 如何根据大小限制轮换 tomcat stdout 日志文件和 stderr 日志文件

java - 连接生产者和两个消费者的最小方式都点对点并在 HornetQ 上广播

java - 为什么Comparable要参数化?

java - HashMap 条目冲突

android - 关于Adapter类如何从HashMap获取key和value

java - HashMap 不同的hashcode 返回不同的值? java

java - 我正在尝试使用 Java 8 在下面的代码片段中实现策略设计模式。寻找更好的实现方法?