我的代码:
StringBuilder sb = new StringBuilder();
events.parallelStream().forEach(event -> {
sb.append(event.toString());
sb.append("\n");
});
我不关心最终结果中events.toString()
的顺序。但是我担心events.toString()
会正确地出现一行,当然没有混合/混乱。
parallelStream
(而不是stream
)在这方面是否安全?
答案 0 :(得分:20)
更好的解决方案是使用
events.parallelStream().map(event -> event+"\n").collect(Collectors.joining());
或者(感谢@Holger):
events.parallelStream().map(Object::toString).collect(Collectors.joining("\n", "", "\n"));
通常避免使用forEach
作为流的终端操作。通常,collect
或reduce
等缩减操作是更好的选择。
答案 1 :(得分:8)
不,它不是线程安全的。
这是旧StringBuffer
和新StringBuilder
之间的主要区别 - 前者的方法是同步的,而后者则不是。
这样做并不是很有用,即使您使用StringBuffer
- 线程也必须等待彼此写入StringBuffer
答案 2 :(得分:4)