如何使用 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 问题是因为您的代码是运行比你想象的要慢。
我想将 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 问题是因为您的代码是运行比你想象的要慢。