如何使用 java 流有效地将地图转换为 CSV?

How to convert a Map to CSV with java streams efficient?

我想将 Map<String, List<String>> 转换为 CSV,其中每个列表应生成一个 csv 行。

Map<String, List<String>> map;

String csv = map.stream()
   .map(entry -> entry.values().stream().collect(Collectors.joining(";")))
   .collect(Collectors.joining("\n"));

问题:对于大型列表,这将在列表与 ; 连接的中间步骤中产生许多 String 个对象。

问题:是否可以重写上面的代码以将结果收集到一个高效的StringBuilder中?

或者我应该放弃 stream 方法并使用一个简单的 for-each 循环,用 StringBuilder.append() 手动附加结果?

Problem: for large lists, this will produce many String objects in the intermediate step where the list is joined with ;.

但这不是问题。 运行 'in context' 并且几乎立即有效地变成垃圾的几个小对象是 'fast garbage' 并且通常几乎没有与之相关的成本。鉴于此 CSV 可能指向磁盘或网络连接这一事实,此类事情的任何性能影响都相形见绌。

single efficient StringBuilder?

... 是的。您正在使用它:Collectors.joining.

你是如何确定你的发现的,因为它们听起来很可疑。具体来说:

many String objects

你的探查器告诉你了吗?您是否正确识别问题?您 在您的代码甚至 运行 之前就拥有 大量字符串对象(毕竟这是一个 Map<String, List<String>> - 很多字符串!)

efficient

CSV 格式强烈表明此 CSV 数据正在脱离进程,无论是到磁盘还是通过网络。一般来说,传输这些数据的效率低下实际上比过程中效率低下的影响大几千倍,所以如果你得出这个结论是因为你的代码 运行ning 比你想要的慢,你是看错东西了。请查看通过网络管道或磁盘发送这些内容的代码。您没有粘贴此代码,但是有很多很多方法可以使它变得非常低效,所以大概是您的实际问题,if 您发布这个 SO 问题是因为您的代码是运行比你想象的要慢。